簡體   English   中英

C ++ RNG(Merenne Twister)需要種子

[英]C++ RNG (Mersenne Twister) needs seed

我編寫了一個RNG類,其中包含不同的算法,但是它不能按預期工作。 除了我要使用正態分布(而不是均勻分布)的事實之外,我的代碼總是返回相同的數字(最大值)或間隔[min,max]中的2個數字:

std::function<int(int, int)> mt19937 =
    [](int min, int max) -> int {
        std::uniform_int_distribution<int> distribution(min, max);
        std::mt19937 engine;
        engine.seed(time(null));
        auto generator = std::bind(distribution, engine);
        return generator();
    };

誰能解釋我解決這個難題的缺失? 此外,如何實現正態分布? 上一次我嘗試了std::normal_distribution我無法進入界限!

編輯:當我說正態分布時,我的意思是RNG的結果在兩個邊界附近不應該像兩個均值一樣頻繁地生成。 例如,查看標准高斯分布的圖形表示。 我指的是它,因為它可視化了我想以此方式實現/使用的結果值的概率(如果您理解的話)。

正態分布就是這樣( x是隨機統一數):

正常

但是我看到一些可能有問題的東西:

std::uniform_int_distribution<int> distribution(min, max);

這不是給您的數字生成器提供int類型嗎?


要解決種子問題,請在lambda之外創建引擎,並在創建引擎時對其進行種子處理。

RNG使用一種算法,該算法產生的數字看起來是隨機的,但是具有很大的重復周期(Mersenne Twister的亮點)。 播種后,請給RNG一個初始值以開始該過程。 每次您要求另一個數字時,它都會發出該算法的另一個迭代。

當您為每個迭代添加種子時:

time(NULL)

該代碼僅每秒更改一次,因此當您請求一個新的隨機數時,它只會每秒更改一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM