gpt4 book ai didi

c# - CompreTo() 中的随机数与 GetHashCode() 的对比?

转载 作者:行者123 更新时间:2023-11-30 18:49:26 25 4
gpt4 key购买 nike

我在我的结构的 CompareTo() 中使用 Random 类,当两个结构具有相同的字段值时,以相同的概率选择其中一个结构。 Random 类使用固定种子进行实例化,以获得可重现的伪随机值序列,以确保无论我使用相同输入运行多少次,我的程序都会给出相同的精确比较结果。

我正在考虑用内存引用或 GetHashCode() 代替随机数。这样做会保证:

(1) 等概率选择,

(2) 如果我再次运行该程序,我会得到相同的结果吗?

struct MyStruct : IComparable<MyStruct>
{
private readonly float _param1;
private readonly float _param2;
private readonly int _randValue;

public MyStruct(float param1, float param2)
{
_param1 = param1;
_param2 = param2;
_randValue = _random.Next();
}

public int CompareTo(MyStruct other)
{
if (_param1 < other._param1)
{
return -1;
}
else if (_param1 > other._param1)
{
return 1;
}
else if (_param2 > other._param2)
{
return -1;
}
else if (_param2 < other._param2)
{
return 1;
}
// If both params are equal, then select one of the structs with
// equal probability
else if (_randValue < other._randValue)
{
return -1;
}
else if (_randValue > other._randValue)
{
return 1;
}

return 0;
}
}

谢谢!

最佳答案

I'm using the Random class in my struct's CompareTo() to pick, with equal probability, one of the structs when both have the same field values.

首先,这是一件非常奇怪的事情。这就像说“当我被要求对一堆数字进行排序时,其中两个都是 12,我随机选择 12 个中的一个较小的”。这没有一点意义。这两个十二是相同的。你没有办法区分一个十二!

你为什么要做这种奇怪的事情?如果这两个值相同,则说它们相同。

在更仔细地阅读您的代码后,我发现您将随机数保存到结构的状态中。如果你想做这件奇怪的事情,那才是正确的做法。

我最初认为您是在随机化比较运算符这是一件极其危险的事情。允许排序算法对作为全序排序的排序有很强的依赖性。 需要比较才能找到自洽的总排序。绝对不能说第一个比第二个大,第二个比第三个大,第三个比第一个大。这违反了比较所需的传递性,并且允许排序算法进入无限循环或在给定行为不当的比较操作时执行任何其他奇怪的行为。

I'm thinking of replacing the random numbers with a memory reference or GetHashCode() instead.

这是一个更糟糕的想法。 GetHashCode 对一件事很有用,而且只对一件事有用:平衡哈希表。如果您没有平衡哈希表并调用 GetHashCode,您做错了什么

此外,想清楚。您所处的情况是两个结构在其他方面比较相等。 契约(Contract)要求 GetHashCode 为比较相等的任何两个结构返回相同的结果。 GetHashCode 显然不是消除两个相同事物之间歧义的来源!事实上恰恰相反。

Will this guarantee that the selection is made with equal probability?

没有。 GetHashCode 不是随机源,也不对散列码的分布做出任何保证。

Will this guarantee that I would end up with the same results if I run the program again ?

绝对不是。

关于c# - CompreTo() 中的随机数与 GetHashCode() 的对比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8497049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com