【发布时间】:2014-06-30 16:20:04
【问题描述】:
- 平台: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;
}
【问题讨论】:
-
我脑海中浮现的第一件事是……你到底为什么要那样做?
-
这是一个问答网站,不是代码审查网站。
-
@BrandonYates 我已经更新了我的帖子,所以现在这是一个问题。
-
@Blindy 为了回答你的问题,我对线性同余生成器感兴趣。现在,如果您能回答我的问题,我将不胜感激。
标签: c