2012-02-02 67 views
2

我編寫了一個程序,該程序用用戶指定的邊數擲骰子。問題是,這太可以預測了。骰子滾動程序在每次運行時都會產生相同的隨機數序列

我正在使用CodeBlocks IDE,編譯器是GCC。該程序可以很好地編譯爲調試版本和發佈版本,但無論選擇哪種構建選項,可執行文件在每次運行時都會返回相同的值。我不能這樣做,因爲它的預期用途是作爲桌面RPG工具,並且如果智能玩家知道骰子滾動的模式,則相對容易。

解決此問題的最簡單方法是什麼?

這裏的源:

#include <iostream>  /* for input and output */ 
#include <cstdlib>  /* for random numbers */ 

using namespace std; 

void rolldie() { 
    cout << "How many sides to the die?" << endl << "D"; 
    int die; 
    cin >> die; 
    int roll = rand() % die +1; 
    cout << endl << "The die rolled " << roll << endl << endl << "Roll another? (Y for yes, anything else for no; Capitalization counts) "; 
} 

int main() { 
    rolldie(); 
    char again; 
    cin >> again; 
    while (again == 89) { 
     rolldie(); 
     cin >> again; 
    } 
    return 0; 
} 
+3

請不要鏈接到你的代碼 - 在這裏表現出來。 – 2012-02-02 18:37:57

+1

使用srand()在調用rand()之前播種隨機數生成器。時間()是一個體面的種子。 – Cameron 2012-02-02 18:37:58

+0

你使用什麼隨機數字發生器?你一定要種下它,但是要告訴你如何*,你必須給我們更多的細節。 – Thilo 2012-02-02 18:39:25

回答

8

你沒有種子的隨機數發生器。我不打算下載你的zip文件,但由於你使用MinGW,我想你可能想看看srandom(3)srand(3)

2

那麼,首先,CStdLib.Rand不是一個好的PRNG。然而,我不知道C++是否足夠了解C++世界的優點,我會看看推薦用於密碼學的PRNG。對於大多數非安全目的來說,這個應該足夠好。

更重要的是,您還沒有「播種」PRNG。這不會自動發生,因爲它與某些其他語言的.NET內置PRNG類似。如果它沒有播種,那麼種子總是恆定的(可能爲零),所以由PRNG算法產生的數字流總是相同的。最常見的種子將基於當前時間(最好是「嘀嗒」分辨率,因此很難準確判斷該次調用所獲取的毫秒數)。種子數據的其他良好來源包括鼠標光標的位置,RAM或HDD的最後訪問地址,或從附屬設備獲得的真正隨機數據(用於在線賭場的服務器通常具有提供實際隨機環境數據的真實RNG設備可用於播種PRNG)。

2

轉到http://www.boost.org並獲得他們的隨機數發生器庫。這是我見過的最好的隨機生成器,尤其是對於C++來說,在任何地方都很難找到合適的生成器。

他們在C++中有各種各樣的東西,所以我強烈推薦瀏覽它們,但是這應該可以解決你輸出的問題太可預測了。只要確保你閱讀如何使用它的說明並正確地給發生器播種。至於將種子用於隨機生成器的方法,在C++中常用的是time(NULL)(可在time.h或ctime中找到)。這隻會返回一個數字,表示自1970年1月1日以來的當前時間(以秒爲單位)。由於每次程序運行時它都會返回一個不同的值,因此它對於較簡單的隨機數很有用,如果將它與boost的隨機生成器結合使用,看起來不錯。

0

答案很簡單:

你想與輸入每次從一些源種子的隨機數生成器,無論是系統(如時間),用戶,文件,或等等。

詳細的解答:

默認的隨機數發生器RAND()是大多數東西很平庸,但看到這個約蘭特更詳細的解答:What's the Right Way to use the rand() Function in C++?

我的建議:

我公司使用需要每天不可預測的隨機數字,他們使用Mersenne Twister算法的變體,並且在遊戲中使用時,您會發現其性能超出了充分的程度。

作爲額外的好處,它已經以各種形式在C和C++中實現,因此將它集成到任何項目中都非常簡單。

例如:http://www-personal.umich.edu/~wagnerr/MersenneTwister.html

或:http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/

相關問題