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

时间:2011-12-05 19:58:09

标签: c random

是否有一种直接的方法来扩展这个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.我原来的帖子中的愚蠢数学错误。

2 个答案:

答案 0 :(得分:3)

存在任意位数的线性同余生成器。

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

x = x * 6364136223846793005 + 1442695040888963407;

答案 1 :(得分:0)

PRNG需要特殊号码才能运作。列出了一些here。其中一个是64位。

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

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

还有其他类型的PRNG,但我相信LCRNG(线性同余)是最简单的。