关于随机函数,求解释,该怎么解决

关于随机函数,求解释
本帖最后由 MicroPDA 于 2015-11-02 17:30:52 编辑
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void h(){
srand((signed)time(NULL));
int a[3]={0,0,0};
    int zu,wo;
zu=rand()%3;
printf("zu=%d ",zu);
a[zu]=1;
wo=rand()%3;
printf("wo=%d\n",wo);

}

void main(){
for(int n=1;n<11;n++)
{
h();
}
}
运行结果,每次调用h()都会产生同样的随机数,如:
zu=2 wo=1
zu=2 wo=1
zu=2 wo=1
zu=2 wo=1
zu=2 wo=1
zu=2 wo=1
zu=2 wo=1
zu=2 wo=1
zu=2 wo=1
zu=2 wo=1
Press any key to continue

更改程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void h(){
int a[3]={0,0,0};
    int zu,wo;
zu=rand()%3;
printf("zu=%d ",zu);
a[zu]=1;
wo=rand()%3;
printf("wo=%d\n",wo);
}

void main(){
srand((signed)time(NULL));
for(int n=1;n<11;n++)
{
h();
}
}

则可正常产生随机数,请问:
为何srand((signed)time(NULL));写在函数里面,每次调用会产生同样的随机数呢?

------解决思路----------------------
嗯,对的,这就是根据时间来决定的,时间太短,值一样
------解决思路----------------------
因为 time 求得的时间粒度太大
你多次调用同一个函数,时间还没来得及变化。
结果是每次产生同一个序列
随机数发生器,是一种遍历一定范围整数 的算法
似乎应该叫,伪随机序列生成器。
我所说的同一程序,两次执行,
指的是
生成的可执行文件。
执行两次,
由于时间差太小,以至于看到的结果相同。
time 似乎是秒级的
------解决思路----------------------
关于随机函数,求解释,该怎么解决

引用:
Quote: 引用:

函数执行结束,随机种子会被销毁。
相当于随机种子被重置了。

既然种子被重置,又是以时间做的种子,那么随机值不是更应该不同么?为啥会相同呢?


time()的时间默认是以秒为单位的。两次执行的时间间隔太短,随机种子会相同。
代码示例:
#include <ctime>
#include <cstdio>
#include <windows.h>
int main()
{
int length = 10;
for(int i = 0; i < length; i++)
{
__int64 out = time(NULL);
printf("%ld\n", out);
Sleep(500); //注释这一句对照运行下
}
return 0;
}


有关time函数的说明,请见:http://www.cplusplus.com/reference/ctime/time/?kw=time