如何创建2个随机对象在2个连续的代码行不同的种子

本文关键字:2个 连续 代码 种子 对象 何创建 创建 随机 | 更新日期: 2023-09-27 18:04:37

我想在连续的2行代码中创建2个不同的Random对象。Random类的无参数构造函数如下所示:

public Random() 
    : this(Environment.TickCount) {
  }

使用Environment.TickCount作为种子。TickCount表示自操作系统打开以来所经过的时间,对吗?

我试了如下:

Random r1 = new Random ();
Random r2 = new Random ();

我发现两个Random对象具有相同的种子,因为它们的Next方法每次返回相同的数字。一行代码的执行速度之快让我感到惊讶。然后我试了:

long tick1 = Environment.TickCount;
for (int i = 0 ; i < 100000 ; i++) {
}
long tick2 = Environment.TickCount;
Console.WriteLine (tick2 - tick1);

得到0。所以我迭代了100000次,仍然没有1毫秒过去?

我只是想问我如何创建2个不同的Random对象,或者是否有另一种方法来生成随机数?

如何创建2个随机对象在2个连续的代码行不同的种子

根据@PankajMishra的回答,试试这个:

//Function to get random number
private static readonly Random getrandom = new Random();
private static readonly object syncLock = new object();
public static int GetRandomNumber(int min, int max)
{
    lock(syncLock) { // synchronize
        return getrandom.Next(min, max);
    }
}

lock块在多线程程序中使用时是有效的,如果你确定只有一个线程使用它,那么你可以防止lock 提高代码性能

对我来说,这似乎是一个XY问题,因为你不需要两个单独的Random实例-你可以使用同一个实例来生成所有的随机数,不是吗?再次调用Next,就这样了:

var rnd = new Random();
int firstRandomInt = rnd.Next();
int secondRandomInt = rnd.Next();

但是,您确实需要2个Random实例,您可以使用第一个实例为第二个实例提供种子:

var rnd = new Random();
var rnd2 = new Random(rnd.Next());