我想设计一个彩票调度程序,我需要一个非常好的(伪)随机数生成器,类似于 LCG,但我想知道是否还有其他更好的选择?我专门寻找用 C 编写的随机生成器。
LCG代码:
unsigned long lcg_rand(unsigned long a)
{
return (a * 279470273UL) % 4294967291UL;
}
我也想知道是否srand()
可以用于此目的还是不高度准确?
如果您需要简单但不错的质量,我会使用 64 位 LCG 的高 32 位(或更少),可能会对输出应用调节功能。执行此操作时,我复制了中使用的回火函数梅森扭转者。我不建议实际使用 Mersenne Twister,因为它比其他 PRNG 具有更多的复杂性和内部状态,但质量却没有明显提高。
这是一些示例代码:
static uint32_t temper(uint32_t x)
{
x ^= x>>11;
x ^= x<<7 & 0x9D2C5680;
x ^= x<<15 & 0xEFC60000;
x ^= x>>18;
return x;
}
uint32_t lcg64_temper(uint64_t *seed)
{
*seed = 6364136223846793005ULL * *seed + 1;
return temper(*seed >> 32);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)