如何创建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
对象,或者是否有另一种方法来生成随机数?
根据@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());