2012-05-24 115 views
2

可能重复:
Random number generator not working the way I had planned (C#)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

在开始使用来自多个线程的单个随机实例之前,请阅读http://csharpindepth.com/Articles/Chapter12/Random.aspx –

+0

我多次调用该函数,但每次都给出不同的输出。 –

回答

11

当您创建一个Random实例时,它会播种当前时间。所以如果你同时创建了它们中的几个,它们将生成相同的随机数字序列。您需要创建一个Random的实例并使用它。

+0

好吧,无论是每个线程的单个实例,还是带锁定的单个实例... –

7

new Random()以当前时间初始化为种子。如果你打电话足够快,那么种子将会和Next()呼叫的结果一样。

2

Random

初始化随机类的新实例,使用 时间相关的默认种子值。

来自MSDN。

默认种子值来自系统时钟,并具有有限的 分辨率。因此,通过调用默认构造函数在 中创建的不同Random对象将具有相同的默认种子值,因此将产生相同的 组随机数。通过使用一个单独的随机对象来生成所有随机数,可以避免此问题。您还可以通过修改系统时钟返回的种子值,然后 明确地向随机(Int32) 构造函数提供此种子值来解决 。有关更多信息,请参阅Random(Int32)构造函数。

1

您可以通过在你的类具有随机的单个实例解决这个问题,并重新使用它产生的随机数

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中,并在所有用户中共享相同的实例。