关于随机函数每次调用会产生同样的随机数

C语言 码拜 9年前 (2015-11-12) 792次浏览
#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));写在函数里面,每次调用会产生同样的随机数呢?
解决方案:5分
嗯,对的,这就是根据时间来决定的,时间太短,值一样
解决方案:10分
原因是 time 求得的时间粒度太大
你多次调用同一个函数,时间还没来得及变化。
结果是每次产生同一个序列
随机数发生器,是一种遍历一定范围整数 的算法
似乎应该叫,伪随机序列生成器。
本人所说的同一程序,两次执行,
指的是
生成的可执行文件。
执行两次,
由于时间差太小,以至于看到的结果相同。
time 似乎是秒级的
解决方案:5分
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


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于随机函数每次调用会产生同样的随机数
喜欢 (0)
[1034331897@qq.com]
分享 (0)