我有以下类型的代码:
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.
如何解决这个问题?
答案 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:
保持一致提供相同的种子价值 不同的随机对象导致每个 实例产生相同的 随机数序列。
因此要么期望种子的相同序列,要么不使用种子。