c语言产生随机数的问题

#include
#include
int main(){
int a=rand();
printf("%d\n",a);
return 0;
}
这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的,求讲解,谢谢。

rand()的机制其实是计算机内部通过一个“种子”来进行一系列的复杂的计算最终生成一个N(具体多少位忘了,好像是13位吧)位长的数,这个数本质上不是随机的,因为他的“种子”是固定的。
所以,如果你想得到一个随机的数的话,那么你的“种子”必须是随机的,你要埋下一个随机“种子”,如何埋一个“种子”,你查查srand()的用法。
或许你会问,如何得到一个随机的“种子”呢?其实很简单,你可以把当前时间当成“种子”埋下去,因为当前时间是不停的在变,你把当前的时间当成“种子”埋下去,经过一系列的复杂计算,所得到的数,就是一个不可预测的N位随机数了,然后你可以通过取余算法来获得你想要的区间的随机数。

 #include<time.h>
int main()
{
    int i;
    srand((int)time(NULL));     //每次执行种子不同,生成不同的随机数
int a=rand();
printf("%d\n",a);
        return 0;
}

http://baike.baidu.com/link?url=UkuIIqdTDZDssWWNWotaP9kDXavGidjK60V6fcBkeih8Oee9vQopeUfWs2htxHLRgjMMPdLMUiCmQLsyaOueVa
这里面已经很详细了

这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,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("%u\n", rand());
    }
    getchar();
    return 0;
}

相同的种子产生相同的数。
用时间作为种子才能产生不同的随机数。

这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的

种子一样的,得到的结果也就一样

参考代码
https://github.com/707wk/Senior-middle-school/blob/master/20140404001.c