2016-03-25 87 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); 
相關問題