C 为什么rand()会产生差值为3或4的整数?
我读到,C 为什么rand()会产生差值为3或4的整数?,c,random,c99,C,Random,C99,我读到,rand()在未播种时生成相同的数字。因此,我添加了srand(),并向它输入单位间隔整数 #include <stdio.h> #include <stdlib.h> int main() { int i; for(i = 0 ; i < 10 ; i++) { srand(i); printf("%d ",rand()); } return 0; } 结果相差3或4。我在区间-
rand()
在未播种时生成相同的数字。因此,我添加了srand()
,并向它输入单位间隔整数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
for(i = 0 ; i < 10 ; i++)
{
srand(i);
printf("%d ",rand());
}
return 0;
}
结果相差3或4。我在区间-9到0
中尝试了相同的方法。结果是可以预测的
9 12 15 19 22 25 28 32 35 38
为什么rand()
会生成这样的数字
为什么
srand(0)
总是导致38
和srand(1)
总是导致41
等等?在计算机系统中没有真正的随机性,即rand()
函数将基于一些数学公式创建一个伪随机数,这些数学公式使用种子初始值,然后在每次后续的rand()
调用后保留状态
您只需对其进行一次种子设定(在整个程序中只需调用srand()
一次)
也就是说,rand()
将基于给定的种子生成相同的结果序列。如果每次给它相同的种子,它每次都会生成相同的序列
要使其正常工作,每次运行程序时都需要使用不同的种子。使用
time()
作为种子是一种流行的选择。rand
因在某些C实现中没有很好地实现而臭名昭著。可以想象,生成器很少使用种子生成下一个值rand()
您应该查看每个序列的第二个数字,看看它们是否具有相似的模式。如果是这样,则实现可能会使用
您可能希望避免使用内置的
srand
和rand
,并寻找诸如Unix的srandom
和random之类的替代方法,您只需要为它播种一次。因为您不应该在循环中调用srand
。@MitchWheat:rand
是实现定义的。你为什么期望你的结果与OP的一致?而且,不,您不应该“应该”调用sr,并且只能调用一个。您应该调用srand
来播种新序列。OP希望检查多个序列,因此他们使用了多个种子。@DavidC.Rankin:在循环中使用srand
是必要的,并且适合OP的既定目标:检查srand
响应rand
的行为。此代码不是他们使用rand
的生产代码;这是他们检查rand
和srand
行为的探索性代码。此外,他们反复调用srand
并不是生成的数字增加3的原因。这是特定的srand
和rand
实现的一个属性,表明它对种子几乎没有处理。@EricPostpischil——正是由于特定的srand
的属性,数字增加了三的原因。半随机分布显然是随着第一项增加3
而产生的。重新初始化分发并打印每次通过循环返回的第一个值会产生所看到的值,因为对种子的处理很少。所有这些都与我在评论中所写的内容不符。Re“计算机系统中没有真正的随机性”:一些处理器,包括主流英特尔处理器,专门从热噪声和/或其他来源收集熵,以便生成随机数,还有一些软件从环境输入中收集噪音,原因也一样。@EricPostChil我知道,你可以使用传感器作为种子的来源,包括一个麦克风来捕捉环境噪音(我相信random.org声称使用这种方法)。但从技术上讲,它仍然不是随机的,而是来自某个来源的数据。物理学界正在等待你的论文,以证明宇宙事实上是确定性的。@Ericspostschil目前物理学家的大多数观点是宇宙是确定性的。但这与此无关question@M.M当前位置缺少任何随机机会,这不是物理学中流行的模型。概率模型更受欢迎。一个好的、快速的(但不是加密安全的)PRNG和一个易于找到的C参考实现是xorshift+。
9 12 15 19 22 25 28 32 35 38