【发布时间】:2017-04-04 06:11:14
【问题描述】:
我试图在 C 中获取有关 rand() 规范和实现的一些信息,但我找不到太多信息。事实上,我找不到任何东西除了:
- rand() 在函数调用之间不前进
- 相同的种子总是产生相同的数字
- 随机数介于 0 和
RAND_MAX之间
值得注意的是,这些东西都不需要随机性。具体来说,我没有看到任何禁止这种实现的东西:
int randval = 0;
void srand(unsigned int seed) {
randval = seed;
return;
}
int rand() {
return randval++;
}
这似乎有些随机。我缺少一些标准吗?
(另外,用 time() 播种 rand() 是不好的,然后用 rand() 播种 ISAAC?)
【问题讨论】:
-
什么是随机?我的意思是,一切都是随机的,序列
5555555555是完全随机的,数字6也是如此。 -
它不必非常随机。该标准包括一个最小可接受的实现,它不是很随机的。不要忘记Dilbert's encounter with randomness。
-
rand()应该只是伪随机的一种非常弱的形式。它远不能保证是随机的。如果你真的需要一个真正的随机数,你也需要自己实现它。 -
我明白“随机是一个模糊的概念”。但是,当我们可以在几次调用后轻松预测下一个数字时,我们是否同意该函数不是非常随机的?我倾向于制作游戏,当每一个障碍都在左边时,这很明显。所以,这个随机性的想法是有东西的。
-
@Orion 在非关键应用程序中使
rand“更随机”的标准方法是在第一次使用之前调用srand。例如,臭名昭著的srand(time(NULL));可以在您的游戏中完成这项工作。