我正在写一个线性同余生成器。我已经读过线性同余生成器生成的高阶位具有更高的周期。我想使用更高阶位,但我不知道如何。我目前的实施使用了' 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;
}
答案 0 :(得分:0)
一个问题可能是计算:
seed * 1664525 + 1013904223
生成一个32位值(uint32_t
),然后将其分配给64位变量。您可能希望将其作为64位计算。
但是,除非您经常溢出64位数字,否则最重要的字节不一定非常随机。
我认为您的代码也容易受到字节序问题的影响。
表达式最小值大的分析会忽略uint32_t
所需的模数2 32 算法。