• 欢迎访问C语言网www.dotcpp.com 比赛栏每月有奖月赛!举办比赛联系QQ:2045302297
  • 问题反馈、粉丝交流 QQ群327452739 蓝桥杯训练群:113766799 申请群时请备注排名里的昵称
  • C语言研究中心 为您提供有图、有料、解渴的C语言专题! 欢迎讨论!

C语言中如何使用随机数?

技术专题 CTO 21383次浏览 3个评论

随机数的使用,是不少在学C语言过程中进行一些小功能开发的同学的一个技术问题,今天我们为大家讲解如何在C语言中使用随机数。

 

通常情况下,使用最多的方法的就是使用rand函数随机生成伪随机数来完成随机数的生成工作。注意这里的伪随机数并非是假的! 只不过是计算机按自己的一套理论生成,并不是”完全理想”状态下的随机数,所以是可以接受的。

函数原型为:int  rand(void);    需要包含stdlib头文件,它可以生成一个0 ~RAND_MAX之间的数字,其中RAND_MAX是一个宏,VC6下笔者查看为0x7fff,建议大家亲自上机实验!

这个时候你可能会遇到下面几个问题:

Q1:为什么每次生成的数字都一样?

A1:rand函数每次生成的数字与所谓的”种子”有关,使用rand函数前需要使用srand函数进行种种子(请见后文)。如果没有调用,系统会默认给1,导致每次的随机数都一样。

Q2:为什么最大是0x7fff?

A1:这可能取决于编译器环境,笔者这里是VC6,在rand的函数中看到定义的最大值为0x7fff,如下图:

C语言中如何使用随机数?

 

Q3:如果我想生成特定范围内的数字,该如何写呢?

A3:多多利用%求余运算符即可。如:

生成10以内的数字,可以参考rand()%10

生成1~10之间的数字,可以参考rand()%10+1

特定的,要生成a~b之间的数字,可以参考rand()%(b-a+1)+a

 

 

更多时候,我们希望每次运行生成的数字都不相同,这个时候需要配合srand函数来解决这一问题。关于具体原因,大家可以参考rand函数与srand函数的实现细节来加以理解,代码如下:

 

 

  1. /***
  2. *rand.c - random number generator
  3. *
  4. * Copyright (c) Microsoft Corporation. All rights reserved.
  5. *
  6. *Purpose:
  7. * defines rand(), srand() - random number generator
  8. *
  9. *******************************************************************************/
  10. #include <cruntime.h>
  11. #include <mtdll.h>
  12. #include <stddef.h>
  13. #include <stdlib.h>
  14. /***
  15. *void srand(seed) - seed the random number generator
  16. *
  17. *Purpose:
  18. * Seeds the random number generator with the int given. Adapted from the
  19. * BASIC random number generator.
  20. *
  21. *Entry:
  22. * unsigned seed - seed to seed rand # generator with
  23. *
  24. *Exit:
  25. * None.
  26. *
  27. *Exceptions:
  28. *
  29. *******************************************************************************/
  30. void __cdecl srand (
  31. unsigned int seed
  32. )
  33. {
  34. _getptd()->_holdrand = (unsigned long)seed;
  35. }
  36. /***
  37. *int rand() - returns a random number
  38. *
  39. *Purpose:
  40. * returns a pseudo-random number 0 through 32767.
  41. *
  42. *Entry:
  43. * None.
  44. *
  45. *Exit:
  46. * Returns a pseudo-random number 0 through 32767.
  47. *
  48. *Exceptions:
  49. *
  50. *******************************************************************************/
  51. int __cdecl rand (
  52. void
  53. )
  54. {
  55. _ptiddata ptd = _getptd();
  56. return( ((ptd->_holdrand = ptd->_holdrand * 214013L
  57. + 2531011L) >> 16) & 0x7fff );
  58. }
  59.  

 

那么srand函数如何使用呢,先看函数原型:

void  srand(unsigned seed);  只需要在rand函数使用之前,调用srand函数传入一个种子即可。但事实上传入一个数,往往产生的随时仍然固定不变。那么较为聪明的写法目前看来只有使用系统时间作为种子最为合适,所以这里srand的参数往往传入time(NULL)参数作为获取系统当前时间作为种子,来产生不同的结果!

并注意类型一致,srand((unsigned)time(NULL)); 记得添加time.h的头文件!

 

测试代码如下:

 

 

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. int main()
  5. {
  6. int r=0;
  7. int i=0;
  8. srand((unsigned)time(NULL));
  9. while(i++<10)
  10. {
  11. printf("r = %d\n",rand());
  12. }
  13. return 0;
  14. }

 

大家可以自行上机测试,如发现新的问题或有其他好玩的,欢迎告知我们!

C语言研究中心(www.dotcpp.com)

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由资深研发工程师或ACM金牌大佬亲授课,更科学、全面的课程体系,以在线视频+在线评测的学习模式学习,学练同步,拒绝理论派,真正学会编程!还有奖学金等增值福利等你!

C语言网, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言中如何使用随机数?
喜欢 (48)
[jinyangH@aliyun.com]
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
(3)个小伙伴在吐槽
  1. 向srand传入time(NULL)参数,我的三次结果也是一样的
    dadan2018-01-10 17:29 回复
    • 那你系统时间没有变过,你看下time(NULL)的返回值每次是不是一样
      cjkdjr2018-07-26 10:03 回复