问题描述
- c语言产生随机数的问题
-
#include
#include
int main(){
int a=rand();
printf("%dn",a);
return 0;
}
这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的,求讲解,谢谢。
解决方案
rand()的机制其实是计算机内部通过一个“种子”来进行一系列的复杂的计算最终生成一个N(具体多少位忘了,好像是13位吧)位长的数,这个数本质上不是随机的,因为他的“种子”是固定的。
所以,如果你想得到一个随机的数的话,那么你的“种子”必须是随机的,你要埋下一个随机“种子”,如何埋一个“种子”,你查查srand()的用法。
或许你会问,如何得到一个随机的“种子”呢?其实很简单,你可以把当前时间当成“种子”埋下去,因为当前时间是不停的在变,你把当前的时间当成“种子”埋下去,经过一系列的复杂计算,所得到的数,就是一个不可预测的N位随机数了,然后你可以通过取余算法来获得你想要的区间的随机数。
解决方案二:
#include<time.h>
int main()
{
int i;
srand((int)time(NULL)); //每次执行种子不同,生成不同的随机数
int a=rand();
printf("%dn",a);
return 0;
}
解决方案三:
相同的种子产生相同的数。
用时间作为种子才能产生不同的随机数。
解决方案四:
http://baike.baidu.com/link?url=UkuIIqdTDZDssWWNWotaP9kDXavGidjK60V6fcBkeih8Oee9vQopeUfWs2htxHLRgjMMPdLMUiCmQLsyaOueVa
这里面已经很详细了
解决方案五:
这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的
解决方案六:
这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的
解决方案七:
rand()函数产生的是伪随机数,即用一个种子(seed)产生的序列,linux下的rand是用类似下面的代码实现的:
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}
rand()返回值是一个可以通过seed计算出来的序列,每次调用rand()时它会返回序列里的下一个元素的值。当然第一次调用时返回的是序列里第1个元素的值。
如果你没有调用srand设置随机数种子,seed的默认值会是0,而seed为0时所决定的序列是固定的,而第一次调用rand()就是返回这个固定序列里的第1个元素,那它的值也是固定的,自然你的程序每次输出都一样了。
所以正确的写法应该是程序初始化时用srand设置不同的随机数种子(只需要设置一次),例如srand(time(NULL)),但要注意,time(NULL)的值是隔1秒才改变一次的。
下面这段程序,只要你不是在同一秒内执行两次,每次输出结果都是不一样的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL)); // 设置随机数种子
for (int i = 0; i < 10; i++)
{
printf("%un", rand());
}
getchar();
return 0;
}
解决方案八:
这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的
解决方案九:
种子一样的,得到的结果也就一样
解决方案十:
参考代码
https://github.com/707wk/Senior-middle-school/blob/master/20140404001.c