Had*_*adi 2 c# random compareto gethashcode
我在我的结构中使用Random类CompareTo()以相同的概率选择其中一个结构,当它们具有相同的字段值时.使用固定种子实例化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;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢 !
Eri*_*ert 16
我在我的struct的CompareTo()中使用Random类以相同的概率选择其中一个结构,当它们具有相同的字段值时.
首先,这是一件非常奇怪的事情.这就像是在说"当我被要求排序一堆数字时,其中两个都是12,我随机选择其中一个为更小".这并没有任何意义.那两个人是完全相同的.你没有办法告诉另一个人十二个!
你为什么要做这件奇怪的事?如果两个值相同,那么说它们是相同的.
在仔细阅读您的代码后,我发现您将随机数保持在结构状态.如果你想做这件奇怪的事情,那就是正确的方法.
我原本以为你是随机化比较运算符本身. 这是一件非常危险的事情.允许排序算法对作为总排序排序的排序采取强依赖性.需要进行比较以找到自我一致的总排序.你绝对不能说第一项大于第二项,第二项大于第三项,第三项大于第一项.这违反了比较所要求的传递性,并且当给定不正常的比较操作时,允许排序算法进入无限循环或做任何其他奇怪的行为.
我正在考虑用内存引用或GetHashCode()替换随机数.
这是一个更糟糕的想法.GetHashCode仅对一件事和一件事有用:平衡哈希表.如果你没有平衡哈希表而你调用GetHashCode 就会出错.
考虑一下.你所处的情况是两个结构否则相等.合同要求GetHashCode为任何两个比较相等的结构返回相同的结果.GetHashCode显然不是两个相同事物之间消歧的来源!事实上,情况恰恰相反.
这是否可以保证选择的概率相等?
不.GetHashCode不是随机源,也不保证哈希码的分布.
如果我再次运行程序,这是否可以保证我会得到相同的结果?
绝对不.
| 归档时间: |
|
| 查看次数: |
879 次 |
| 最近记录: |