C#随机问题

C#随机问题,c#,random,C#,Random,我有两个不同的实现随机函数: 第1版: public double myRnd() { Random rnd = new Random(); return rnd.NextDouble(); } //-- Generate Random Number for Delaer double DealersCard = myRnd();

我有两个不同的实现随机函数:

第1版:

  public double myRnd()
        {
            Random rnd = new Random();
            return rnd.NextDouble();
        }                


            //-- Generate Random Number for Delaer
            double DealersCard = myRnd();

            //-- Generate Players  4 Random Number
            double Box1Card = myRnd();
            double Box2Card = myRnd();
            double Box3Card = myRnd();
            double Box4Card = myRnd();
第2版:

       //-- Create  Random  Object 
        var rnd = new Random();

        //-- Generate Random Number for Delaer
        double DealersCard = rnd.NextDouble();

        //-- Generate Players  4 Random Number
        double Box1Card = rnd.NextDouble();
        double Box2Card = rnd.NextDouble();
        double Box3Card = rnd.NextDouble();
        double Box4Card = rnd.NextDouble();
哪种方法更好

版本2要好得多。第1版完全崩溃了

版本1为每个数字重新创建
Random
<代码>随机由
环境设定种子。滴答声计数
仅每1-16毫秒更改一次。因此,在该时间间隔内,对
myRnd
的所有调用都将得到相同的随机数

此外,第2版速度更快,因为它不需要重新创建
Random


类似的问题经常被问到,通常是由那些实现了版本1的人提出的,他们想知道为什么版本1不适用。例如:

Random
的MSDN文档说明:

随机数生成从种子值开始。如果重复使用同一种子,则生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而产生一个不同的序列,每个新的随机序列实例。默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间的节拍数获取Int32值。但是,由于时钟的分辨率有限,因此使用无参数构造函数创建不同的连续随机对象会创建随机数生成器,生成相同的随机数序列



由于这是一个非常常见的错误,我已经提交了一份申请。

第一份申请不太有效

任何随机函数都是伪随机的,得到的随机值取决于种子。创建
Random
对象时,将使用当前时间作为种子

因此,每当您想要一个随机数时,创建一个新的
Random
对象时,您就会一次又一次地使用当前时间进行种子设定,这可能会导致重复获得相同的数(因为当前时间可能没有改变,这取决于它使用的计时器的精度和分辨率)


Random
类用于创建一个对象,从中可以获得随机数序列

关于你的第一个版本中的问题的老问题:你将卡片表示为双打?好吧,你使用哪一张并不重要。在版本1中,您将得到完全相同的随机数。这不会影响结果,你需要先洗牌。因此,使用完全相同的随机数从洗牌甲板没有关系。我推荐4,由一个公平的骰子选择。你的进步肯定是一个进步;但是如何实现它却不打破“两个相同应用程序的运行提供不同的RANDOM”?“上校我不明白你的意思。在C++中,RAND()为SRAND(时间(现在))获得了同样的值,这是定义良好的。我认为同样的合同在c#corner,我只是建议更改
Random
的无参数构造函数。这不会影响提供种子以获得确定性序列的用户。我认为
new Random()
没有使用播种时间的合同义务。我仍然对您可能有的任何解决方案非常感兴趣