为什么我的随机数生成器为两个数组播种相同的数字?

Dom*_*tal 3 .net c# random

我正在使用一种方法来创建两个int具有随机数的新数组,但这两个数组包含完全相同的数字.为什么会这样?

    static void Main(string[] args)
    {
        int[] Foo1= Foo(1000);
        int[] Foo2= Foo(1000);
    }
    static int[] Foo(int length)
    {
        int[] Array = new int[length];
        Random r = new Random();
        for (int i = 0; i < length; i++)
        {          
            Array[i]=r.Next(1, 101);   
        }
        //Thread.Sleep(6);
        return Array;
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*rtW 6

你不是种子随机播种,但你可能在调用之间使用它足够接近默认种子在两种情况下相同:

默认种子值源自系统时钟并具有有限的分辨率.因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集.使用单个Random对象生成所有随机数可以避免此问题.您还可以通过修改系统时钟返回的种子值,然后将此新种子值显式提供给Random(Int32)构造函数来解决此问题.有关更多信息,请参阅Random(Int32)构造函数.


Ste*_*e B 5

这是因为你的随机数被初始化了两次,时间差太小而没有种子.

试试这个 :

static void Main(string[] args)
{
    Random r = new Random();
    int[] Foo1= Foo(1000,r);
    int[] Foo2= Foo(1000,r);
}
static int[] Foo(int length, Random r)
{
    int[] Array = new int[length];

    for (int i = 0; i < length; i++)
    {          
        Array[i]=r.Next(1, 101);   
    }
    //Thread.Sleep(6);
    return Array;
}
Run Code Online (Sandbox Code Playgroud)

  • 我会建议*使用像这样的静态变量*因为Random不是线程安全的,而静态成员通常应该是.相反,在Main中创建一个"Random"实例并将其传递给`Foo`方法. (3认同)

Jon*_*eet 5

另一个回答"你正在使用具有相同种子的两个Random实例"是正确的.但是,他们曾经使用静态变量来引用一个实例Random.如果您尝试从多个线程使用它,这可能会导致问题,因为Random它不是线程安全的.

有各种解决方法(例如创建Random每个线程的一个实例,使用静态方法安全地访问它) - 我写了很多关于这个主题的文章,你可能会发现它很有用.