随机数生成相同怎么办

为什么生成的随机数都是一样的 应该怎样进行更改?

#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()函数中产生一次随机数种子即可。

修改如下:

参考链接:


https://blog.csdn.net/weixin_42386033/article/details/117122728

#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();
}
 
 

img

望采纳,谢谢!
因为C语言的随机数发生器是一个确定的算法,每次生成的随机数都是由上一次生成的随机数决定的,所以每次生成的随机数都是一样的。要想更改这种情况,可以使用srand()函数,在使用rand()函数生成随机数之前,先调用srand()函数,给它传递一个随机数种子,每次给它传递的种子都不一样,这样每次生成的随机数就不一样了。

srand只能传一次,不要每次都传TIME
cpu是很快的,时间还没来得及变,就已经循环了好多次,每次都传同一个TIME那么你随后随机的数当然是同一个数
这里就涉及到随机数的原理
计算机不能做到真随机,各种随机算法其实都是伪随机
只要你先确定一个数,那么根据这个数继续随机其他数,总能保证随机到的数看起来足够散(但是真随机其实是可以连续两次随机到同一个数的,伪随机则更接近人的直觉,不会连续随机到同一个数)
然而随机算法需要一个初始的数,以保证不要每次随机出的第一个数都相同,这就需要你先传入一个种子
如果你传入的种子每次都一样,那么它算出的随机数必然一样

用srand给传一个种子,要不然每次调用随机数都是一样的哦

你这个RAND_MAX是未定义的吧

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^