当前位置:网站首页 > 技术博客 > 正文

c语言随机函数rand怎么用



 

rand函数在使用的时候无需传参,调用该函数时它返回一个介于0和RAND_MAX(32767)之间的伪随机整数
例如:我们用rand函数生成10个随机数。

 

运行结果如下:
在这里插入图片描述

当我们重复运行上面的代码时,我们会发现,每次的运行结果都是一样的,这说明了这里的随机指的是,如果程序持续运行,rand返回不同的数字,而这里每次程序运行结果都是相同序列明显不相关的数字,并没有做到真正意义上的随机。这是因为rand函数生成的随机数是由一个算法生成的,该算法每次调用它时都会返回一系列明显不相关的数字。而该算法是使用不同种子来生成不同的序列,且序列使用函数srand初始化为一些不同种子。如果用rand函数之前并没有调用srand函数来初始化进去不同的种子,它就会默认为1为种子,来生成随机数序列。而我们上面的程序,就是没有用srand函数初始化不同的种子,它都默认1为种子来生成随机数序列,而相同种子生成的随机数序列是相同的,因此当我们重复运行上面的代码时,程序每次的运行结果都是一样的。接下来我们就来了解一下srand函数是如何用不同的种子来进行初始化的。

 
  • 对于srand调用中使用的不同种子值,可以使得伪随机数生成器在随后的rand调用中生成不同的连续结果。
    例如:用10作为种子和20作为种子生成随机。
 

10作为种子运行结果如下:在这里插入图片描述
20作为种子运行结果如下:在这里插入图片描述
从两次代码运行结果就可以验证这一说法。

  • 如果调用srand函数并将seed设置为1,则生成器将被重新初始化为其初始值,则与没调用srand函数产生相同的值。

例如:用1作为种子调用srand和不调用srand。

 

运行结果如下:
在这里插入图片描述
把1作为种子调用srand函数生成的10个随机和上面没调用srand相比较(没调用sran函数时,种子也默认设置成1),我们不难发现两次生成的随机数是一模一样的。

  • 使用相同种子来初始化随机数生成器将在对rand的后续调用中生成相同的连续结果。
 
 

运行结果如下:
在这里插入图片描述当我们每次运行上面打的代码的时候会发现,每次打印的数字都不一样,这是因为每次运行程序的时间不同,time函数返回的时间戳就不同,因此我们可以用time函数返回的时间戳当作srand初始化随机生成器的种子。
注意事项:

  • srand的参数类型是unsigned int,而time函数的返回值是time_t,因此把time函数的返回值当srand函数的参数时,需要强制类型转换一下。
  • 而我们也不需要time函数通过参数把时间戳存储起来,因此可以给传一个空指针(NULL)。
    代码如下:
  • srand函数在每次程序运行的时候在调用rand函数之前调用一次即可,只需要保证这次运行程序的种子和下次运行程序的种子不同。
 
  • 我们知道,如果我们要想生成1~100内的随机数,只需要用生成的随机数%100,就能得到 0~99之间的数字,然后在此基础上+1,即可得到,即
    rand() % 100 + 1。
  • 因此我们要生成[a, b]范围内的数字,只需要用生成的随机数%(b-a+1),就能得到 0~(b-a)之间的数字,然后在此基础上+a,即可得到[a, b]范围内的数字,即
    rand() % (b-a+1) + a
  • 游戏规则:系统随机生成一个1~100的数字,让玩家来猜,若玩家猜大了,提示玩家猜大了,并让其重新猜,猜小了也同理,直到玩家猜对为止。
    代码如下:`
 

若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。

创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

如果本篇博客有任何错误,请批评指教,不胜感激 !
在这里插入图片描述

版权声明


相关文章:

  • 在线编译器的工作原理2025-03-30 13:01:01
  • 成员函数调用方法2025-03-30 13:01:01
  • python协程gevent2025-03-30 13:01:01
  • vc2010安装步骤2025-03-30 13:01:01
  • impdp导入数据2025-03-30 13:01:01
  • 怎么升级成windows112025-03-30 13:01:01
  • iis ftp 断点续传2025-03-30 13:01:01
  • sqlalchemy异步查询2025-03-30 13:01:01
  • 归并排序算法过程图解2025-03-30 13:01:01
  • linux打印错误码2025-03-30 13:01:01