标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:  

        函数一:int rand(void);

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

        函数二:void srand(unsigned seed);

参数seed是rand()的种子,用来初始化rand()的起始值。(一般情况下:我们都使用time(NULL)种子, 从一个时间点(一般是1970年1月1日0时0分0秒)到那时的秒数(即日历时间))

#define   RAND_MAX   0x7fffu   

这个是bcc55中的定义,说明这个整数的最大数是0x7fffu,u代表unicode编码。

PS: time(NULL)返回值是time_t,实际上是长整型,到未来的某一天。对于time_t数据类型的值来说,它所表示的时间不能晚于2038年1月18日19时14分07秒。不过基本上也够大家使用了,如果需要更长的时间,可以使用64的_time64来进行处理。

rand()在每次被调用的时候,它会查看:

1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。

        2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。  

                根据上面的第一点我们可以得出:

                1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。

                2)否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。

                3)如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。

产生随机数的用法

1) 给srand()提供一个种子,它是一个unsigned int类型;

2) 调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到RAND_MAX之间);

3) 根据需要多次调用rand(),从而不间断地得到新的随机数;

4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。

一定范围随机数的通用表示公式

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
  • 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
  • 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
  • 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
  • 要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
  • 要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

MSDN标准示例代码

  1. // crt_rand.c
  2. // This program seeds the random-number generator
  3. // with the time, then exercises the rand function.
  4. //
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <time.h>
  8. void SimpleRandDemo( int n )
  9. {
  10. // Print n random numbers.
  11. int i;
  12. for( i = 0; i < n; i++ )
  13. printf( "  %6d\n", rand() );
  14. }
  15. void RangedRandDemo( int range_min, int range_max, int n )
  16. {
  17. // Generate random numbers in the half-closed interval
  18. // [range_min, range_max). In other words,
  19. // range_min <= random number < range_max
  20. int i;
  21. for ( i = 0; i < n; i++ )
  22. {
  23. int u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)
  24. + range_min;
  25. printf( "  %6d\n", u);
  26. }
  27. }
  28. int main( void )
  29. {
  30. // Seed the random-number generator with the current time so that
  31. // the numbers will be different every time we run.
  32. srand( (unsigned)time( NULL ) );
  33. SimpleRandDemo( 10 );
  34. printf("\n");
  35. RangedRandDemo( -100, 100, 10 );
  1. }
  2. from:http://blog.csdn.net/xiaoting451292510/article/details/17550161

最新文章

  1. struts2使用配置文件中使用json-default的问题
  2. 贪吃蛇(Java实现)
  3. 菜鸟疑问之新建网站与新建web应用程序区别
  4. vi和vim区别及命令详解
  5. Android AChartEngine 个性化设置
  6. tty驱动程序框架
  7. 使用SQL字符串反转函数REVERSE巧妙实现lastindexof功能
  8. 《c程序设计语言》读书笔记--大写转小写
  9. [翻译]Behavior-Driven Development (BDD)行为驱动开发(二)
  10. LeetCode 55
  11. [POJ 1674] Sorting by Swapping
  12. Android定时器实现方法[转]
  13. BZOJ 1497 最大获利(最大权闭合子图)
  14. 代码混淆 GSON完满解决
  15. linux GUI程序开发
  16. win8快捷键
  17. Redis配置信息
  18. Vim安装使用和配置
  19. IDEA 开发环境中设置Subversion,遇到svn安装路径包含空格无法使用版本控制的解决办法
  20. git解决not a git repository

热门文章

  1. 在jdbc中使用properites文件进行使用
  2. Linux服务器上安装MySql数据库(默认安装,密码为空),首次使用需要修改密码
  3. VB 如何调用 c++ DLL?
  4. 为什么在Python里推荐使用多进程而不是多线程
  5. Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
  6. javascript获取网页地址栏的id
  7. 【前端】nodejs的ORM框架sequelize的工厂化
  8. jsp页面报错(一)
  9. 《实战Nginx》读书笔记--Nginx配置文件
  10. web开发性能优化---数据库篇