C语言中的伪随机数rand()和真随机数srand()

  • 随机数函数rand()

    函数rand()其实是一个伪随机数生成器,为什呢?

    //rand()函数的内核算法
    static unsigned long int next = 1;//种子
    unsigned int rand(void{
    	/*生成伪随机数的魔术公式*/
        next = next * 1103515245 + 12345;
        return (unsigned int) (next / 65536) % 32768;
    }
    

    不难看出,每次调用函数rand(),他的初始化种子都是从1 开始。这就说明虽然他得到的数是随机的,但是关闭程序再次运行得到的随机数又都是一样的。这可真糟糕!如何做到真真的随机呢?

    //srand()函数的内核算法
    static unsigned long int next = 1;//种子
    unsigned int rand(void{
    	/*生成伪随机数的魔术公式*/
        next = next * 1103515245 + 12345;
        return (unsigned int) (next / 65536) % 32768;
    }
    void srand(unsigned int seed)
    {
        next=seed;
    }
    

    不难看出,只需要每次运行程序的时候把种子变一下,不让他从1开始,就达到了随机的效果。。。。

    有一个方法,可以每次都随机种子,她就是srand((unsigned int)tine(0));

    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    
    srand((unsigned int )time(0));
    

    一般而言,time()函数接受的参数是一个time_t类型对象的地址,而时间值就存储在传入的地址上,当然,也可以传入空指针(0)作为参数,这种情况下,只能通过返回值机制来提供值。

    //srand() demo
    int main()
     {
        int a,b,c,d;
        //每次种子都会发生变化,得到的值就是一个随机的
    	srand((unsigned int)(time(0)));
        for(int i=0;i<5;i++){
        	a=rand()%100;
        	b=rand()%100;
        	c=rand()%100;
        	d=rand()%100;
        	printf("%d\n%d\n%d\n%d",a,b,c,d);
    	}
     } 
    

    给大家里留一个思考题,我看看多少人可以答对?

    思考:如果把srand((unsigned int)(time(0)))放在循环开头会是怎么样呢?代码我放在下面了,欢迎大家在评论区作答

 int main()
     {
        int a,b,c,d;
        for(int i=0;i<5;i++){
        srand((unsigned int)(time(0)));
        	a=rand()%100;
        	b=rand()%100;
        	c=rand()%100;
        	d=rand()%100;
        	printf("%d\n%d\n%d\n%d",a,b,c,d);
    	}
     } 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值