c语言rand函数生成随机数,详解C语言生成随机数rand函数的用法[通俗易懂]

说到rand函数,大家是不是会和EXCEL中的rand函数混淆,当小编第一次接触的时候也以为是EXCEL的函数,本文是爱站技术频道小编为大家带来的详解C语言生成随机数rand函数的用法,一起来看看吧!函数rand()是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子…

大家好,又见面了,我是你们的朋友全栈君。

说到rand函数,大家是不是会和EXCEL中的rand函数混淆,当小编第一次接触的时候也以为是EXCEL的函数,本文是爱站技术频道小编为大家带来的详解C语言生成随机数rand函数的用法,一起来看看吧!

函数rand()是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 srand()会导致相同的随机数序列被生成。

srand((unsigned)time(NULL))则使用系统定时/计数器的值做为随机种子。每个种子对应一组根据算法预先生成的随机数,所以,在相同的平台环境下,不同时间产生的随机数会是不同的,相应的,若将srand(unsigned)time(NULL)改为srand(TP)(TP为任一常量),则无论何时运行、运行多少次得到的“随机数”都会是一组固定的序列,因此srand生成的随机数是伪随机数。

库函数中系统提供了两个函数用于产生随机数:srand()和rand()。 原型为:

函数一:int rand(void);

从srand (seed)中指定的seed开始,返回一个[0, RAND_MAX(0x7fff)]间的随机整数。

函数二:void srand(unsigned seed);

参数seed是rand()的种子,用来初始化rand()的起始值。

但是,要注意的是所谓的“伪随机数”指的并不是假的随机数。其实绝对的随机数只是一种理想状态的随机数,计算机只能生成相对的随机数即伪随机数。计算机生 成的伪随机数既是随机的又是有规律的 —— 一部份遵守一定的规律,一部份则不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正点到了事物的特性 —— 差异性;但是每种树的叶子都有近似的形状,这正是事物的共性 —— 规律性。从这个角度讲,我们就可以接受这样的事实了:计算机只能产生伪随机数而不是绝对的随机数。

系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始 值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的~~

所以为了避免上述情况的发生我们通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))来 产生种子。如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某个合适的整数。 例如,srand((unsigned)time(NULL)*10)

另外,关于time_t time(0):time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。

生成随机数函数rand用法,如代码所示:

#include “stdafx.h”

#include

#include

int _tmain(int argc, _TCHAR* argv[])

{

// 初始化随机数种子

// time函数返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒

srand((int)time(NULL));

int j;

for (int i = 0; i < 10; i++) {

j = (rand() * 10) / RAND_MAX + 1; // 生成1~10之间的随机数

printf(“j = %d \n”, j);

}

unsigned start = (rand() * 1000)/ RAND_MAX + 15550; // 生成15550~16549之间的随机数

printf(“start = %d \n”, start);

start &= ~1; // 把start变为偶数,如果是奇数,则start变为start – 1的偶数

printf(“start = %d \n”, start);

getchar();

return 0;

}

运行结果如下所示:

j = 9

j = 6

j = 7

j = 8

j = 1

j = 5

j = 3

j = 1

j = 10

j = 9

start = 16185

start = 16184

本文是爱站技术频道小编给大家分享的详解C语言生成随机数rand函数的用法,大家在学习的时候可千万别混淆了,感兴趣的朋友可以继续留意爱站技术频道的推荐。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126051.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • multisim彻底卸载的方法

    multisim彻底卸载的方法

    2021年11月10日
    1.3K
  • UCOSII系统移植详解「建议收藏」

    UCOSII系统移植详解「建议收藏」一,移植UCOSII操作系统的CPU前提条件1,处理器的C编译器能产生可重入型的代码,如果不行的话,那么就不能在任务之间随意的切换,因为当你切换到别的任务的时候,该任务在这个函数的数据就会被破坏。2,处理器CPU支持中断,并能产生定时中断3,用C语言就可以开关中断,进行任务切换4,处理器CPU能够支持一定数量的数据存储硬件堆栈,也就是栈5,处理器有将堆栈指针以及其他的CPU的寄存器的内容读出,并存储到堆栈或者内存中去的指令。任务切换的时候,需要将当前的CPU指针保存到刚刚执行的任务当中。

    2022年5月4日
    45
  • linux top load average过高_load指令是什么意思

    linux top load average过高_load指令是什么意思Linux操作系统loadaverage过高,kworker占用较多cpu今天巡检发现,mc1的K8S服务器集群有些异常,负载不太均衡。其中10.2.75.32-34,49的loadaverage值都在40以上,虽然机器的cpu核数都是40或48核不算严重,但也值得重视。登陆机器查看,执行top发现,cpu的使用率接近40%,sys有20-30,user有10-20。也发现有大量…

    2022年9月2日
    4
  • es6类型转换_单片机ad转换原理

    es6类型转换_单片机ad转换原理babelES6转换ES5实现原理

    2022年9月24日
    0
  • win11的 logstash 7.6.2 连接es 7.6.2集群「建议收藏」

    win11的 logstash 7.6.2 连接es 7.6.2集群「建议收藏」小伙伴们,你们好,我是老寇一、下载logstash(跳过)注意:一定要与es版本保持一致二、启动es集群(es集群搭建)三、配置logstash.confinput{tcp{port=>5044codec=>json_lines}}output{elasticsearch{hosts=>[“192.

    2022年4月30日
    73
  • poj 1094 Sorting It All Out (拓扑排序)

    poj 1094 Sorting It All Out (拓扑排序)

    2022年1月12日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号