例如,如果我有一个班级:
public class Class
{
public Random r;
public Class()
{r= new Random()}
}
以后再创建它的两个实例:
Class a = new Class();
Class b = new Class();
并按顺序调用r,两者的r将给出相同的值。我读过这是因为Random的默认构造函数使用时间来提供“随机性”,所以我想知道如何防止这种情况。提前谢谢!
答案 0 :(得分:5)
实现这一目标的一种方法是制作r
static
。
static
表示只有一个Random r
存在,并且会在所有类的实例中共享。
您的代码如下所示:
public class Class() { static Random r = new Random(); }
Class a = new Class();
Class b = new Class();
如果您正在使用线程,则可以将其设为[ThreadStatic]
(以便每个线程使用自己的Random类实例)
有关如何使用[ThreadStatic]
here的信息 - 我自己没有使用它,但它看起来非常酷和漂亮,并且摆脱任何潜在的与线程相关的困境。
答案 1 :(得分:4)
Random类的构造函数基于时间。因此,当您以快速顺序创建它们时 - 它们将获得相同的种子,然后将生成相同的值。
所以你需要以某种方式为你的类分享Random -or - 自己提供不同的初始种子。
答案 2 :(得分:2)
在这种情况下,一种可能性是将Random设为静态,以便仅实例化一次。
public class Class{
private static Random r = new Random();
//the rest of your class
}
问题在于你几乎同时创建了两个类,因此它们将使用相同的种子(因为它基于当前时间和其他事物),并将生成相同的数字序列。
答案 3 :(得分:1)
试试这个:
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);
}
}