将K&R的rand()扩展到64位?

3
有没有一种简单的方法来扩展这个rand()函数(来自K&R的《C程序设计语言》),使其能够产生64位随机数而不是15位?
int rand()
{
  rand_next = rand_next * 1103515245 + 12345;
  return (unsigned int)(rand_next/ 65536) % 32768;
}

编辑:我的意思是将其更改为使用64位数字和不同的魔术数字。而不是将其放入for循环中。

编辑#2:此算法实际上是15位随机性,而不是30位。我的原始帖子中有愚蠢的数学错误。


只需多次调用它并进行一些位运算魔术即可吗? - Mysticial
“Numerical Recipes In C” 中列出了适用于线性同余随机数生成器的合适数字列表。 - ninjalj
2
不要这样做。有更好的(而且至少同样快速)替代伪随机数生成器可用(并且易于获取)。例如,可以参考GSL - bitmask
1
同时不要多次调用普通的 rand 并将结果连接起来。这样做只会减少熵(除非连接使用了其他熵源,其熵比较高,在这种情况下,您应该只使用那个熵源本身)。 - Thomas Eding
2个回答

3

线性同余生成器适用于任意位数。

例如,对于64位的MMIX,使用以下递归公式:

x = x * 6364136223846793005 + 1442695040888963407;

0

PRNG需要特殊的数字才能工作。这里列出了一些链接。其中之一是64位。

n = (n * 6364136223846793005 + 1442695040888963407) & 0xFFFFFFFFFFFFFFFF;

或者

n = (n * 0x5d588b656c078965 + 0x269ec3) & 0xFFFFFFFFFFFFFFFF;

还有其他类型的伪随机数生成器,但我认为线性同余法(LCRNG)是最简单的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接