4

可能重复:
随机数生成器未按我计划的方式工作(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

4 回答 4

13

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

于 2012-05-24T16:22:48.063 回答
7

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

于 2012-05-24T16:22:30.267 回答
3

您可以通过在您的类中使用 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 类。如果您希望它在一组用户中,您可以将您的生成逻辑包装在一个单例中,并在所有用户之间共享相同的实例。

于 2012-05-24T16:26:26.583 回答
2

随机的

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

来自 MSDN。

默认种子值来自系统时钟并且具有有限的分辨率。因此,通过调用默认构造函数连续创建的不同 Random 对象将具有相同的默认种子值,因此将产生相同的随机数集。这个问题可以通过使用单个 Random 对象来生成所有随机数来避免。您还可以通过修改系统时钟返回的种子值,然后将这个新的种子值显式提供给 Random(Int32) 构造函数来解决此问题。有关详细信息,请参阅 Random(Int32) 构造函数。

于 2012-05-24T16:24:49.190 回答