随机数与CompreTo()中的GetHashCode()?

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不是随机源,也不保证哈希码的分布.

如果我再次运行程序,这是否可以保证我会得到相同的结果?

绝对不.

  • 它并不危险,因为随机数是在创建时分配的,并且是在结构状态的不可变部分之后.因此,它不违反相对排序的传递性.我仍然不能为我的生活弄清楚他们为什么要这样做. (2认同)