为什么生成的随机数都是一样的 应该怎样进行更改?
#include
#include
#include
double random(double down,double top)
{
double num;
srand((unsigned int)time(NULL));
num=(double)rand()/RAND_MAX;
num=down+num*(top-down);
return num;
}
void dingjifen()
{
double a,b,d,n,x,y,i,m;
printf("请输入n:\n");
scanf("%lf",&n);
printf("请输入大于0的a,b:\n");
scanf("%lf%lf",&a,&b);
d=1+b*b;
for(i=1,m=0;i<=n;i++)
{
x=random(a,b);printf("%lf ",x);
y=random(0,d);
if(y<=(1+x*x))
{
m++;
}
}
printf("f(x)的定积分=%lf",(m*(b-a)*d/n));
}
int main()
{
dingjifen();
}
因为以time(NULL),即从1970年1.1日(元旦)午夜0点到现在的秒数作为srand()函数的参数,在程序的运行过程中,因为计算速度很快,time(NULL)返回的时间很有可能是一个相同的值,即使用srand()函数使用一个相同的数值来设置随机数种子,所以后续产生的随机数都是以此种子来产生的相同序列下的随机数,所以就表现为产生了相同的随机数。
根据网络搜索的srand()函数的模拟实现,发现它使用了一个全局静态变量作为随机数种子,所以可以把srand()函数放在dingjifen()函数中产生一次随机数种子即可。
修改如下:
参考链接:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
double random(double down,double top)
{
double num;
// unsigned int t = (unsigned int)time(NULL);
// printf("\nt=%u\n",t);
// srand(t);
num=(double)rand()/RAND_MAX;
num=down+num*(top-down);
return num;
}
void dingjifen()
{
double a,b,d,n,x,y,i,m;
printf("请输入n:\n");
scanf("%lf",&n);
printf("请输入大于0的a,b:\n");
scanf("%lf%lf",&a,&b);
d=1+b*b;
srand((unsigned int)time(NULL)); // 在定积分中调用srand()产生一次随机数种子即可
for(i=1,m=0;i<=n;i++)
{
x=random(a,b);
printf("%lf ",x);
y=random(0,d);
if(y<=(1+x*x))
{
m++;
}
}
printf("f(x)的定积分=%lf",(m*(b-a)*d/n));
}
int main()
{
dingjifen();
}
望采纳,谢谢!
因为C语言的随机数发生器是一个确定的算法,每次生成的随机数都是由上一次生成的随机数决定的,所以每次生成的随机数都是一样的。要想更改这种情况,可以使用srand()函数,在使用rand()函数生成随机数之前,先调用srand()函数,给它传递一个随机数种子,每次给它传递的种子都不一样,这样每次生成的随机数就不一样了。
srand只能传一次,不要每次都传TIME
cpu是很快的,时间还没来得及变,就已经循环了好多次,每次都传同一个TIME那么你随后随机的数当然是同一个数
这里就涉及到随机数的原理
计算机不能做到真随机,各种随机算法其实都是伪随机
只要你先确定一个数,那么根据这个数继续随机其他数,总能保证随机到的数看起来足够散(但是真随机其实是可以连续两次随机到同一个数的,伪随机则更接近人的直觉,不会连续随机到同一个数)
然而随机算法需要一个初始的数,以保证不要每次随机出的第一个数都相同,这就需要你先传入一个种子
如果你传入的种子每次都一样,那么它算出的随机数必然一样
用srand给传一个种子,要不然每次调用随机数都是一样的哦
你这个RAND_MAX是未定义的吧
不知道你这个问题是否已经解决, 如果还没有解决的话: