簡體   English   中英

Mersenne Twister種子無效

[英]Mersenne Twister seed has no effect

因此,我有一個使用Mersenne Twister的自定義隨機化器類(我使用的代碼從該站點改編而成)。 在開始測試不同的種子之前,一切似乎都工作良好(我通常使用42作為種子,以確保每次運行程序時結果都是相同的,因此我可以看到代碼更改如何影響事物)。

事實證明,無論我選擇哪種種子,代碼每次都會生成完全相同的數字序列。 顯然我在做錯事,但是我不知道該怎么辦。 這是我的種子函數:

void Randomizer::Seed(unsigned long int Seed)
{
    int ii;
    x[0] = Seed & 0xffffffffUL;
    for (ii = 0; ii < N; ii++)
    {
        x[ii] = (1812433253UL * (x[ii - 1] ^ (x[ii - 1] >> 30)) + ii);
        x[ii] &= 0xffffffffUL;
    }
}

這是我的Rand()函數

unsigned long int Randomizer::Rand()
{
    unsigned long int Result;
    unsigned long int a;
    int ii;

    // Refill x if exhausted
    if (Next == N)
    {
        Next = 0;

        for (ii = 0; ii < N - 1; ii++)
        {
            Result = (x[ii] & U) | x[ii + 1] & L;
            a = (Result & 0x1UL) ? A : 0x0UL;
            x[ii] = x[( ii + M) % N] ^ (Result >> 1) ^ a;
        }

        Result = (x[N - 1] & U) | x[0] & L;
        a = (Result & 0x1UL) ? A : 0x0UL;
        x[N - 1] = x[M - 1] ^ (Result >> 1) ^ a;
    }
    Result = x[Next++];

    //Improves distribution
    Result ^= (Result >> 11);
    Result ^= (Result << 7) & 0x9d2c5680UL;
    Result ^= (Result << 15) & 0xefc60000UL;
    Result ^= (Result >> 18);

    return Result;
}

各種值是:

#define A 0x9908b0dfUL
#define U 0x80000000UL
#define L 0x7fffffffUL

int Randomizer::N = 624;
int Randomizer::M = 397;
int Randomizer::Next = 0;
unsigned long Randomizer::x[624];

誰能幫我弄清楚為什么不同的種子不會導致不同的數字序列嗎?

您的Seed()函數將分配給x[0] ,然后在ii=0處開始循環,這會用未定義的值(它引用x[-1] )覆蓋x[0] 從1開始循環,您可能已經准備就緒。

編寫自己的隨機器很危險。 為什么? 很難做到正確(參見上文),很難知道您是否做對了,如果做錯了,那么依賴正確分布的隨機數的事物將無法正常工作。 希望這不是密碼學或統計學建模的尾巴問題。...考慮使用std :: random ,或者如果您尚未使用C ++ 11,請考慮boost :: random

暫無
暫無

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

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