3

C 语言之随机数函数(rand())的使用方法

 2 years ago
source link: https://knightyun.github.io/2018/04/25/c-rand-number
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C 语言之随机数函数(rand())的使用方法

在程序设计中,难免会使用到随机值函数,其原理与语法大多类似,接下来以C语言为例介绍其随机值函数 rand() 用法。

引用百度百科,首先,需要包含头文件:

#include <stdlib.h> rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说C语言的随机并不是真正意义上的随机,有时候也叫[伪随机数][wei],使用 `rand()` 生成随机数之前需要用随机发生器的初始化函数 `srand(unsigned seed)`(也位于 `stdlib.h` 中) 进行伪随机数序列初始化,`seed` 又叫[随机种子][seed],通俗讲就是,如果每次提供的 `seed` 是一样的话,最后每一轮生成的几个随机值也都是一样的,因此叫伪随机数,所以需要每次提供不同的 `seed` 达到完全的随机,我们通常用时间函数 `time(NULL)` 作为 `seed` ,因为时间值每秒都不同,这个函数需要包含以下头文件:

#include <time.h>

理论太泛,下面用例子分析理解。

先来理解以下伪随机数,编译以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	srand(1);
	int i;
	for (i = 0; i < 10; i++)
	printf("%d, ", rand()%11); 
} 
8, 9, 9, 1, 7, 5, 5, 10, 1, 0,

然后无论运行多少次,结果都依然是以上随机数,不会改变,因为每次设置的种子 seed 都是 1

但是假如把 seed 换成 time(NULL),每次就不一样了,如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	srand(time(NULL));
	int i;
	for (i = 0; i < 10; i++)
	printf("%d, ", rand()%11); 
} 

结果是就变了,并且每次都不一样:

6, 3, 4, 5, 5, 9, 8, 10, 10, 4,
6, 4, 2, 4, 3, 2, 5, 1, 2, 9,

这里的 time(NULL) 的结果是一个类似于 1524655706 的数字,并且每秒都在递增 1,也就达成了 srand() 的 seed 不断变化的目的,不断生成新的随机数。

这里注意一下例子中函数 rand() 的用法,函数括号内不需要加参数,如果直接调用 rand() 的话会生成下面这样的数:

17163, 2663, 24810, 4875, 26975, 14119, 22193, 11233, 26009, 20105, 所以我们想要生成指定范围的随机数的话就需要使用到**求余**运算符 `%`,这里有个规律:例如我们需要 0--10的随机数时,就写成 `rand()%11`,0--100就写成 `rand()%101`,就是运算符后的数字需要比需求范围极值大 1,当然这也是取余运算的原理。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK