2016-03-25 60 views
-1

我目前正在为游戏推箱子编写一个关卡生成程序。我使用rand()函数来生成每个级别,并且我认为一个很好的特性是用户能够控制用于代的种子,这意味着两个人可以输入相同的种子,并且发电机会产生相同的电平。产生一个随机种子给予srand() - 不是时间(NULL)

我一直在使用

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()函数?

+1

有没有你不能使用'任何理由C++ 11 '和那个随机数字生成器? – Galik

+0

如果rand()是一个线性同余生成器,相似的种子可以给出相似的初始值。解决方法是简单地运行发生器十几次,这样值就会更加分散。 –

+0

感谢您的回复家伙。 @Galik我不知道C++ 11有随机数字生成器,我会看看它们。 –

回答

1

我结束了使用C++ 11均匀分布的随机数生成器来给我,像这样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); 
相关问题