相同的随机值

时间:2011-12-08 18:41:44

标签: c# random

  

可能重复:
  Random number generator not working the way I had planned (C#)
  Why does it appear that my random number generator isn't random in C#?

我遇到随机值问题

        int weight = 0;
        Random random = new Random();
        for (int i = 0; i < entriesCount; i++)
        {
            weight = random.Next(10);
        this.weights[i] = weight;
        }

此代码位于我的对象的构造函数中。我创建了3个不同的对象

Object object1 = new Object(2);
Object object2 = new Object(2);
Object object3 = new Object(2);

对于每个对象,我得到相同的随机值,例如:4,5 | 4,5 | 4,5

每次我以相同的顺序获得相同的值。我不明白为什么&gt;请帮忙

祝你好运, 的Dawid

4 个答案:

答案 0 :(得分:3)

问题是你每次都在创建一个新的随机数。创建Random类的实例时,它将当前时间用作种子。如果您非常快速地多次执行此操作,则会获得相同的种子值,因此不同的Random实例会输出相同的结果。

为了解决这个问题,您需要确保每次都将随机播种,或共享并使用单个Random实例。最简单的选择是将Random实例设为静态:

class YourClass
{
    private static Random randomGenerator = new Random();

    public YourClass(int entriesCount)
    {
       int weight = 0;
       for (int i = 0; i < entriesCount; i++)
       {
           weight = randomGenerator.Next(10);
           this.weights[i] = weight;
       }
    }
    // .. rest of your class

这将导致类始终重用相同的Random实例,因此每次都会得到不同的值。

请注意,如果您要在多线程场景中使用它,则还必须同步对随机实例的访问,或者提出不同的方法(例如保存种子值,并使用某些东西)比如Interlocked.Increment来增加它并从每个实例中播种一个新的随机数等。)

答案 1 :(得分:0)

Random是伪随机数生成器,这意味着任何给定种子的输出序列都是相同的。如果将种子传递给构造函数,则会得到不同的序列。

答案 2 :(得分:0)

据我所知,除非另有说明,否则系统时间会随机播种。它根据此数字生成数字。当你几乎完全同时创建它们时,它们具有相同的种子并且几乎总是返回相同的数字和序列。

任何简单的修复方法都是创建一个静态随机的所有实例共享,并在该静态对象上调用.Next()。

答案 3 :(得分:0)

来自MSDN documentation

“使用无参数构造函数以紧密连续的方式创建不同的随机对象,创建随机数生成器,生成相同的随机数序列。”