>本文讲述了在C语言中如何获取随机数。

## rand()

`rand()`函数可以用来产生伪随机数,它根据一个基准(种子)以某个递推公式推算出随机数。当使用rand()产生的一系列数符合正态公布时,就相当于产生了随机数。计算机正常开机后,种子的值是默认固定的,为1。

/* @brief 随机数发生器

* @return 返回一个伪随机数

* @header stdlib.h

*/

int rand(void)

`rand()`返回随机数值的范围在`0`至`MAX_INT`(定义在limits.h)间。每一个数被选择的概率是相同的。

## srand()

`rand()`产生的是伪随机数字,程序每次执行时产生的序列是相同的。若要每一次运行程序都产生不同的序列,则需用函数`srand()`初始化随机数种子。

/* @brief 初始化随机数发生器

* @param 种子

* @header stdlib.h

*/

void srand(unsigned int seed)

`srand()`用来设置`rand()`产生随机数时的随机数种子。参数seed必须是个整数,如果每次seed都设相同值,`rand()`所产生的随机数序列每次就会一样。

### 选择随机数种子

#### 使用当前时钟作为种子

可以利用`srand((unsigned int)(time(NULL))`的方法,使用当前时钟作为种子传递给`srand()`。

## 产生随机数的用法

1. 给srand()提供一个种子;

2. 调用rand(),返回一个随机数(在0到MAX_INT之间);

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

无论什么时候,都可以给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是整数的范围。

## 生成[0, n-1]之间的k个不同随机数

怎么快速生成[0, n-1]之间的k个不同的随机顺序的随机整数?按照直觉,我们会通过不停地调用`rand() % n`来生成新的随机数,直到生成够k个为止来达成目的,这期间还用到了某种容器和搜索算法。然而,这种思路导出的代码复杂又低效。

实际上,有一个优美的实现可以达到要求:

```c

/* 生成[0, n-1]之间的k个不同随机数 */

void foo(int* a, int n, int k)

{

int i;

for(i = 0; i < n; ++i)

a[i] = i;

for(i = 0; i < k; ++i)

swap(&a[i], &a[randint(i, n-1)]);

}

```

其中,`swap(int*, int*)`交换两个`int*`指针指向的内存单元的值,`randint(min, max)`生成[min, max]之间的随机数。

linux c语言 取随机数,C语言 获取随机数相关推荐

  1. java获取随机数方法_《Java语言程序设计》Java获取随机数方法

    <Java语言程序设计>Java获取随机数方法 在Java中我们可以使用java.util.Random类来产生一个随机数发生器.它有两种形式的构造函数,分别是Random()和Rando ...

  2. Flutter获取随机数 Dart语言核心基础

    也许你迷茫,但是我想说,在你迷茫的同时,保持本心,过好今天就好. 学习Dart语言,首先我们需要使用到一个语言调试工具 DartPad 在 Dart 中,dart:math 类库提供了 数学常数和函数 ...

  3. linux更改语言脚本,Linux shell脚本入门——shell语言脚本【CentOS】

    认识脚本 是使用一种特定的描述性语言,依据一定的格式编写的可执行文件.脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只 ...

  4. r软件 linux,分享|Linux 上好用的 R 语言 IDE

    前一段时间,我已经介绍过 Linux 上针对 C/C++ 语言的最好 IDE.很显然 C 或 C++ 并不是现存的唯一的编程语言,是时间讨论某些更加特别的语言了. 假如你做过一些统计工作,很可能你已经 ...

  5. Linux学习篇——基于C语言使用结构体、链表实现贪吃蛇

    基于Linux下,通过c语言.链表.结构体下实现--贪吃蛇小项目 一.需要用的头文件以及Linux图形库函数.数据初始化 (1)关于curses.h图形库函数 二.地图制作 三.蛇身链表的初始化生成 ...

  6. R语言使用basename函数获取数据链接地址中的文件名称(removes all of the path up to and including the last path separator )

    R语言使用basename函数获取数据链接地址中的文件名称(removes all of the path up to and including the last path separator (i ...

  7. R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项)、randomSequence函数创建不含重复项的随机序列数据集、创建随机字符串

    R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项).randomSequence函数创建不含重复项的随机序列数据集.创建随机字符串 ...

  8. R语言list.dirs函数获取目录列表实战

    R语言list.dirs函数获取目录列表实战 目录 R语言list.dirs函数获取目录列表实战 #仿真数据 #获取目录列表

  9. R语言list.files函数获取文件列表实战

    R语言list.files函数获取文件列表实战 目录 R语言list.files函数获取文件列表实战 #仿真数据 #基本语法

  10. R语言attributes函数(获取属性、设置属性)、attr函数(改变一个属性)、structure函数(改变数据形状)实战

    R语言attributes函数(获取属性.设置属性).attr函数(改变一个属性).structure函数(改变数据形状)实战 目录

最新文章

  1. [pcl::VoxelGrid::applyFilter] Leaf size is too small for the input dataset. Integer indices would ov
  2. 跟我学Springboot开发后端管理系统4:数据库连接池Druid和HikariCP
  3. linux 安全基线加固
  4. 从频率角度理解为什么深度可以加速神经网络的训练
  5. Maven编译代码的相关命令
  6. python调用动态库出现error193_切换到64位时使用Python Winerror 193
  7. 1.5 编程基础之循环控制 10 满足条件的数累加
  8. 微信小应用资源汇总整理
  9. 查看linux应用zabbix版本
  10. Cadence元件库介绍
  11. 现代操作系统 第三章 内存管理 习题
  12. 一级必杀,防不胜防的漏洞,WEB安全基础入门—文件上传漏洞
  13. matlab tube函数,2015-08-25-OpenCV for Matlab Users (5) - OpenCV 自身易搞混的函数辨析
  14. PLC 定时器实现 亮1秒,灭4秒,一直循环下去
  15. flash常见问题集锦,很适合新手哦
  16. Linux查看和结束进程命令详解
  17. 程序员学英语——In November the English learning summary
  18. 围棋GUI界面Sabaki的安装与使用
  19. Unity的Handles类
  20. 学习笔记——day47(jsp)

热门文章

  1. 贾俊平统计学思维导图- 第一章 导论
  2. http长连接与主动断开方
  3. 低密度奇偶校验码(LDPC)GMSK调制解调器 毕业设计
  4. 基于KNN的手写数字识别
  5. 平衡小车—TB6612FNG与直流电机控制教程
  6. 自己开店用什么收银系统好-纳客收银系统
  7. 计算机控制系统编程语言,可编程控制器常用的几种编程语言
  8. 光盘安装服务器找不到硬盘,安装系统找不到硬盘怎么办实测解决
  9. vue-JsMind思维导图实现(包含鼠标右键自定义菜单)
  10. 数据中台(五)数据开发:数据价值提炼工厂