当前位置:首页 » 《随便一记》 » 正文

【C语言】随机数的生成

11 人参与  2024年10月20日 17:21  分类 : 《随便一记》  评论

点击全文阅读


 

目录

一、rand函数

二、srand函数

三、time函数

四、生成指定范围内的随机数


 

一、rand函数

        我们想要生成一个随机数,可以使用rand函数(随机数生成器),rand函数定义在<stdlib.h>头文件中。它的函数原型如下:

int rand(void);

        它能返回一个 0~RAND_MAX 之间的整数,RAND_MAX的大小由编译器厂商设定,但一般是32767。可以设置多个随机数试一下:

95f5a2ce1f6541518a6c6301d0540646.png

        重复运行上面的程序,会发现每次的执行结果都一样,这样就失去了随机数的意义。实际上rand生成的是伪随机数,这种随机数是按照规定的算法以设置的“种子”值为基准计算出来的,所以本质上是不随机(按照某种规则生成)的。因为rand默认种子值是1,所以算法计算的结果都是一样的。如果想让每次运行的结果都不同,那么需要让种子值变化起来。

二、srand函数

        srand函数就能用于设置rand函数的种子值(初始化随机数生成器),它也定义在头文件<stdlib.h>中,其函数原型如下:

void srand(unsigned int seed);

        现在又有一个问题,如果我们需要让种子值随机,但是我们想解决的就是rand生成随机数的问题,那不就矛盾了吗?我们不能得到随机的种子值,但是能得到变化的种子值,比如根据时间而变化。

三、time函数

        time函数能获得当前的时间戳,时间戳就是当前的时间与计算机的初始时间1970年1月1日0时0分0秒之间的差值,以秒为单位。它定义在<time.h>头文件中,其函数原型如下:

time_t time(time_t *timer);

        可以看看VS2019 的 time_t的定义:

#ifndef _CRT_NO_TIME_T    #ifdef _USE_32BIT_TIME_T        typedef __time32_t time_t;    #else         typedef __time64_t time_t;    #endif#endiftypedef long                   __time32_t;typedef __int64                __time64_t;

        本质上 time_t 是32位或64位整型。当time的参数非NULL时,time函数不仅会返回时间戳,还会把返回的时间戳存储在timer指向的内存空间里;当参数为NULL时,time函数只返回时间戳。

        现在有了rand函数、srand函数和time函数,就能生成每次运行都不一样的随机数了,如下:

ac2c471579044e06b5536997eadb4950.png

第一次运行

b1f3650dbcae4ccf907a8e216f6ace44.png

第二次运行

        最后我们要注意的是,程序中随机数种子只需要设置一次就行了,不要把它放在循环里面,比如这样:

e4ff171805cf452d8d85409fa7065056.png

        这样会导致每一轮循环生成的随机数都是一样的,因为程序执行得很快,很多轮循环都会发生在同1秒内,导致时间戳没变,设置的种子值也就不变了。可以看看我把循环次数改为1000后(时间延长),首尾的循环轮次生成的随机数是有变化的:

75561ec02cb348b5a42ea5e673dc04ee.png

前面的循环生成的随机数

35f2b50a3cf14a8b97fd23139c05f7a6.png

最后面的循环生成的随机数

四、生成指定范围内的随机数

//生成1~100之间的随机数rand() % 100 // 0~99rand() % 100 + 1 // 1~100//生成100~200之间的随机数100 + rand() % (200 - 100 + 1)//生成a~b之间的随机数a + rand() % (b - a + 1)

五、更正

        更正一下,上面的要写成srand((unsigned int) time(NULL))更规范,因为time函数返回值是time_t类型,srand函数参数是unsigned int类型的。如果不强制转换VS上也会有警告。为了代码的可移植性和正确性,还是加上比较好。

 

 

 


点击全文阅读


本文链接:http://zhangshiyu.com/post/174642.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 京圈佛子破戒后,我改嫁京圈纨绔(沈墨渊,白晶晶)
  • 前世被闺蜜害死,重生后我让她从太子妃变疯女苏婉儿,清歌完本_前世被闺蜜害死,重生后我让她从太子妃变疯女(苏婉儿,清歌)
  • 全书浏览七零军嫂太彪悍,带三宝上军区离婚(沈清落,陈桂花,陆有为)_七零军嫂太彪悍,带三宝上军区离婚(沈清落,陈桂花,陆有为)全书结局
  • 今天也没变成昨天(周扬陈默)全书免费_(周扬陈默)今天也没变成昨天后续(周扬陈默)
  • 重生后,秦总非要父以子贵(许沐晴,秦越泽)全书浏览_重生后,秦总非要父以子贵全书浏览
  • 他嫌弃我喝两块钱豆浆上不了台面,我结婚后他又哭又闹全书万照,白青青在线
  • 昭然若梦前尘烬列表_昭然若梦前尘烬(温昭然方池雲)
  • 导师借我股票账号,我倒欠五十万(孟潇潇,宁薇)_导师借我股票账号,我倒欠五十万孟潇潇,宁薇
  • 拒绝把外卖券给舍友,竹马送我到迪拜捡垃圾(周钰泽,蒋清清,思源)全书浏览_拒绝把外卖券给舍友,竹马送我到迪拜捡垃圾全书浏览
  • 我的人生,你已出局(程森凌古楚文)_我的人生,你已出局程森凌古楚文
  • 穿书成病娇女配,睁眼就签下离婚协议书(朱楼)_穿书成病娇女配,睁眼就签下离婚协议书
  • 老婆逼我给白月光捐肾,我死后她悔疯了(宋逸晨沈墨白)全书浏览_老婆逼我给白月光捐肾,我死后她悔疯了全书浏览

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1