【发布时间】:2016-07-13 13:39:11
【问题描述】:
我目前正在为推箱子游戏编写关卡生成程序。我经常使用 rand() 函数来生成每个级别,并且我认为一个不错的功能是让用户能够控制用于生成的种子,这意味着两个人可以输入同一个种子并且生成器会生成相同的关卡。
我一直在用
srand(std::time(NULL));
要生成运行良好的种子,我的程序将使用相同的种子生成相同的关卡,这没问题。然而,由于 std::time(NULL) 以毫秒为单位返回系统时间,它并没有给出非常有趣或多样化的数字,即它会产生 1476894985,然后下一个种子可能是 1476897904。
为了提供一些更有趣的种子,我尝试使用以下代码在 0 到 9999999999 之间创建一个随机种子:
typedef unsigned long long ull;
SokoGenerator::ull SokoGenerator::randomNumber(ull min, ull max, int divisor){
ull number = rand() % (max - min + 1)+ min;
while(number % divisor != 0){
number = rand() % (max - min + 1) + min;
}
return number;
}
srand(std::time(0));
genSeed = randomNumber(0, 999999999); }
srand(genSeed);
//Generate Levels After this point
但这似乎产生了类似的结果,只是它们现在小了很多,即 45789、46389、47958。
有没有更好的方法来生成一个介于 0 和 9999999999 之间的良好随机种子以提供给 srand() 函数?
【问题讨论】:
-
您有什么理由不能使用
C++11和附带的随机数生成器吗? -
如果
rand()是一个线性同余生成器,相似的种子可以给出相似的初始值。解决方案是简单地运行生成器十几次,以使值差异更大。 -
感谢大家的回复。 @Galik 我不知道 C++11 有随机数生成器,我会看看它们。
-
我不明白你在做什么。如果您希望用户输入种子,为什么要生成随机种子?如果你想要一个随机种子,为什么不直接使用
time(0)?
标签: c++ random srand random-seed