可能重复:
Random number generator not working the way I had planned (C#)
我制作了一个生成随机数的简单例程
private int randomNumber()
{
Random random = new Random();
int randomNum = random.Next(0, 100);
Response.Write(randomNum);
return randomNum;
}
我在整个page_load的两个不同阶段以相同的方式调用它:
// A/B Test
if (randomNumber() <= 50)
{
...
我发现,这两个数字总是一样的。有什么想法吗?
答案 0 :(得分:11)
当您创建Random
个实例时,它会以当前时间播种。因此,如果您同时创建其中的几个,它们将生成相同的随机数序列。您需要创建Random
的单个实例并使用它。
答案 1 :(得分:7)
new Random()
初始化为当前时间作为种子。如果你足够快地调用它,那么种子将是相同的,Next()
调用的结果也是如此。
答案 2 :(得分:2)
来自MSDN的使用a初始化Random类的新实例 与时间相关的默认种子值。
。
默认种子值是从系统时钟派生的,并且是有限的 解析度。结果,创建了不同的Random对象 通过调用默认构造函数来关闭连续 相同的默认种子值,因此,将产生相同的 随机数集。使用单个可以避免此问题 随机对象生成所有随机数。你也可以解决 它通过修改系统时钟返回的种子值然后 明确地向Random(Int32)提供这个新的种子值 构造函数。有关更多信息,请参阅Random(Int32)构造函数。
答案 3 :(得分:1)
你可以通过在你的类中使用Random的单个实例来解决这个问题,并重复使用它来生成随机数
public class TestPage : Page
{
private Random Generator {get;set;}
public Test()
{
this.Generator = new Random();
}
private int randomNumber()
{
return this.Generator.Next(0, 100);
}
}
这将为每个请求创建一个Random类。如果您希望将其包含在一组用户中,则可以将生成逻辑包装在Singleton中,并在所有用户之间共享相同的实例。