随机类不会创建随机数?

时间:2011-06-09 19:56:29

标签: c# random

  

可能重复:
  Why is Random class isn't really random?

我有以下类型的代码:

public static int GenerateRandomNumber(int seed)
{
    var random = new Random(seed);                
    int num = random.Next();
    while(num.ToString().Length != 6){
        num = random.Next();
    }
    return num;
}

我希望每次使用相同的种子调用此函数时获得不同的数字。但我总是得到同样的结果。 例如,每次拨打GenerateRandomNumber(1)时,我总是得到号码640839.

如何解决这个问题?

5 个答案:

答案 0 :(得分:12)

  

我希望每次使用相同的种子调用此函数时都会得到不同的数字。

由于那是what the Random constructor is documented to do相反,你将不得不学会以失望的方式生活。你无法总是得到你想要的东西。

答案 1 :(得分:6)

这是你的问题:

var random = new Random(id); 

Random生成一组伪随机结果 - 对于同一个种子,每次都会得到相同的序列。

Random对象的创建更改为静态字段,只要您调用它,就会得到不同的结果。

来自MSDN - Random Class

  

随机数生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。

答案 2 :(得分:0)

Random根据名为种子的初始值(代码中为id)创建一系列伪随机数。

由于种子是相同的,因此对函数的所有调用都将遵循相同的代码路径并生成相同的结果。

使random = new Random(seed)成为函数中的静态变量,或使其成为包含类的成员,并将其传递给所有需要它的函数/类。

在完成程序开发后,请考虑使用基于时间的种子值。

答案 3 :(得分:0)

  

我希望每次使用相同的种子调用此函数时都会得到不同的数字。

这不是种子的运作方式。种子的全部意义在于使用相同的种子将产生相同系列的伪随机数。该系列是确定性的

答案 4 :(得分:0)

您需要解决的问题是将您的期望与product specifications

保持一致
  

提供相同的种子价值   不同的随机对象导致每个   实例产生相同的   随机数序列。

因此要么期望种子的相同序列,要么不使用种子。