rand()函数可以产生[0,RAND_MAX]之间的均匀的伪随机数,它定义在头文件stdlib.h中,函数原型:

int rand(void);

C标准库的实现是:

unsigned long int next = ;

/*rand: return pseudo-number integer on 0...32767*/
int rand(void)
{
next = next* + ;
return (unsigned int)(next/) % ;
} /*srand: set seed for rand()*/
void srand(unsigned int seed)
{
next = seed;
}

如果没有初始化“随机数种子”,那么默认初始种子是1,1*1103515245+12345,return得到第一个伪随机数,接着将这个结果作为下次的种子,带入式子得到第二个伪随机数……

之所以定义为unsigned int,是防止数值溢出后不会出现负值。

直接调用rand(),会导致产生的是同一套随机数,所以我们使用srand()来初始化随机数种子。

要注意的是:不同编译器计算随机数的方法不尽相同,所以即使给srand()传递相同的参数,也可能产生不同的随机数序列。

举个栗子:

/*产生0-9的随机数*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h> int main(int argc,char** argv)
{
srand(time(NULL)); //初始化随机数种子
for(int i = ;i < ;i++)
{
printf("%d ",rand()%);
} return ;
}

利用rand()%n产生[0,n)之间的随机数,那么一旦n > RAND_MAX,这种做法就会失效。

如果你对精度的要求不高,可以采用如下办法:
先用rand()/RAND_MAX,得到[0,1]之间的随机实数,然后扩大n-1倍,四舍五入,就可得到[0,n-1]之间的随机数。

/*产生10个[0,99999]之间的随机数*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h> int main(int argc,char** argv)
{
int n = ;
double random_doub;
int random_num; srand(time(NULL)); //初始化随机数种子 for(int i = ;i < ;i++)
{
random_doub = (double)rand() / RAND_MAX; //生成[0,1]之间的随机数
random_num = (int)((n - )*random_doub + 0.5); //生成[0,n-1]之间的随机数
printf("%d ",random_num);
} return ;
}

最新文章

  1. Bug库
  2. git配置
  3. *HDU3635 并查集
  4. 初版storm项目全流程自动化测试代码实现
  5. jQuery.qrcode.js客户端生成二维码,支持中文并且可以生成LOGO
  6. (转) java 简单工厂模式(实现一个计算器)
  7. Java Web表达式注入
  8. 了解 C++ 默默编写并调用的函数
  9. SQL2008-显示表大小行数
  10. 一个好看的Input样式
  11. R语言中的if-else语句写法
  12. [css]《css揭秘》学习(二)-多重边框
  13. 关于html以及js相关格式验证的记录
  14. koa-static node服务器设置静态目录
  15. matlab 图像设置
  16. Android Studio 新建drawable-hdpi、drawable-mdpi等
  17. LaTeX技巧:LaTeX括号总结
  18. Dockerfile的一些demo
  19. phpstorm中FTP自动同步功能
  20. SSH安全

热门文章

  1. python基本知识点if、while、等等
  2. C/C++ 数据精确度的设置
  3. Flask 入门(九)
  4. C语言实现顺序栈以及栈的特点
  5. .Net微服务实战之技术架构分层篇
  6. HTML5实现刷脸支付
  7. 理解class.forName() ---使用jdbc方式链接数据库时会经常看到这句代码
  8. lambda表达式,及lambda简化过程
  9. Linux 命令系列之 seq
  10. Daily Scrum 1/6/2015