C#随机函数返回相同的值

时间:2012-05-24 16:20:42

标签: c# random

  

可能重复:
  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)
{
...

我发现,这两个数字总是一样的。有什么想法吗?

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:7)

new Random()初始化为当前时间作为种子。如果你足够快地调用它,那么种子将是相同的,Next()调用的结果也是如此。

答案 2 :(得分:2)

  

Random

     

使用a初始化Random类的新实例   与时间相关的默认种子值。

来自MSDN的

  

默认种子值是从系统时钟派生的,并且是有限的   解析度。结果,创建了不同的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中,并在所有用户之间共享相同的实例。