我目前正在为Sokoban游戏编写一个关卡生成程序。我使用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()函数?
答案 0 :(得分:1)
我最终使用C ++ 11 Uniform Distribution Random Number Generator给我一个0到4,294,967,295之间的值,如下所示:
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution;
generator.seed(chrono::steady_clock::now().time_since_epoch().count());
random = distribution(generator);