线性同余发生器C.

时间:2014-06-30 16:20:05

标签: 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;
}

1 个答案:

答案 0 :(得分:0)

一个问题可能是计算:

seed * 1664525 + 1013904223

生成一个32位值(uint32_t),然后将其分配给64位变量。您可能希望将其作为64位计算。

但是,除非您经常溢出64位数字,否则最重要的字节不一定非常随机。

我认为您的代码也容易受到字节序问题的影响。

表达式最小值大的分析会忽略uint32_t所需的模数2 32 算法。