簡體   English   中英

線性同余生成器C

[英]Linear Congruential Generator C

  • 平台:Linux 3.2.0 x86(Debian Wheezy)
  • 編譯器:GCC 4.7.2(Debian 4.7.2-5)

我在寫線性同余生成器。 我已經讀過線性同余生成器生成的高階位具有較高的周期。 我想使用高階位,但不知道如何使用。 我目前的實現方式使用《數值食譜》一書中的'a'和'c'值,因為方程ax + c的最大可能值可以表示為64位整數。

#define ran32(seed) (uint32_t)((seed) * UINT64_C(1664525) + UINT64_C(1013904223))

為了消除低階位,我嘗試了以下方法,但是據我所知,它不會在無符號32位整數的整個范圍內返回值。

#define ran32(seed) (uint32_t)(((seed) * UINT64_C(1664525) + UINT64_C(1013904223)) / UINT64_C(256))

這個想法是2 ^ 8(256)的整數除法等效於'foo'>>8。這個想法的靈感來自於rand()文檔中的以下代碼段。

static unsigned long next = 1;
int myrand(void)  /* RAND_MAX assumed to be 32767. */
{
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}

void mysrand(unsigned seed)
{
    next = seed;
}

一個問題可能是該計算:

seed * 1664525 + 1013904223

產生一個32位值( uint32_t ),然后將其分配給一個64位變量。 您可能希望將其作為64位計算。

但是,除非您經常溢出64位數字,否則最高有效字節不一定會變得非常隨機。

我認為您的代碼也容易出現字節順序問題。

您對表達式的最小值較大的分析忽略了uint32_t所要求的模數2 32算術。

暫無
暫無

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

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