如何让两个随机数连续给出不同的值
本文关键字:连续 随机数 两个 | 更新日期: 2023-09-27 17:59:11
例如,如果我有一个类:
public class Class
{
public Random r;
public Class()
{r= new Random()}
}
然后创建两个实例:
Class a = new Class();
Class b = new Class();
并且按顺序调用r,则两者的r将给出相同的值。我读到这是因为Random的默认构造函数使用时间来提供"随机性",所以我想知道如何防止这种情况。提前感谢!
实现这一点的一种方法是使r
成为static
。
static
意味着只有一个Random r
将存在,并且它将在类的所有实例之间共享。
你的代码应该是这样的:
public class Class() { static Random r = new Random(); }
Class a = new Class();
Class b = new Class();
如果使用线程,可以将其设为[ThreadStatic]
(这样每个线程都使用自己的Random类实例)
这里有关于如何使用[ThreadStatic]
的信息——我自己还没有用过,但它看起来很酷,很漂亮,并且消除了任何潜在的线程相关问题。
因此,您需要以某种方式为您的类共享Random-或-自己提供不同的初始种子。
在这种情况下,一种可能性是使Random成为静态的,这样它只实例化一次。
public class Class{
private static Random r = new Random();
//the rest of your class
}
问题是,您几乎同时创建两个类,因此它们将使用相同的种子(因为它基于当前时间等),并将产生相同的数字序列。
试试这个:
public class TestClass
{
private static int seed = Environment.TickCount;
public TestClass()
{
DoStuff();
DoStuff();
DoStuff();
DoStuff();
}
private void DoStuff()
{
var random = new Random(seed++);
int index = random.Next(30) + 1;
//Console.Write(index);
}
}