C 语言中生成随机数
本文将介绍几种如何在 C 语言中生成随机数的方法。
使用 rand
和 srand
函数在 C 语言中生成随机数
rand
函数实现了一个伪随机数生成器,可以提供一个范围为 [0, RAND_MAX]
的整数,其中 RAND_MAX
在现代系统中是 231-1。注意,rand
函数背后的生成器算法是确定性的。因此,它的种子位应该是随机位。
srand
函数用于为伪随机数生成器提供种子,随后对 rand
的调用将产生随机整数序列。在缺点方面,rand
的实现不希望产生均匀的随机位。因此,rand
函数不建议在密码学高度敏感的应用中使用。下面的例子用当前时间的值作为生成器的种子,这不是一个好的随机性来源。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
srand(time(NULL));
for (int i = 0; i < NUMS_TO_GENERATE; i++){
printf("%d\n", rand() % MAX);
}
exit(EXIT_SUCCESS);
}
输出:
85084
91989
85251
85016
43001
54883
8122
84491
6195
54793
使用 random
和 srandom
函数在 C 语言中生成随机数
C 标准库中可用的另一种伪随机伪随机数生成器是在 random
函数下实现的。与 rand
相比,这种方法是首选方法,但在敏感代码中,加密应用不应利用 random
函数。random
不接受任何参数,并返回 [0, RAND_MAX]
范围内的 long int
类型的整数。该函数最好用 srandom
函数做种子,以产生质量相对较好的随机数。
需要注意的是,和前面的例子一样,我们使用 time
函数传递当前的时间值作为种子,在安全敏感的应用中不建议使用。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/random.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
srandom(time(NULL));
for (int i = 0; i < NUMS_TO_GENERATE; i++){
printf("%ld\n", random() / MAX);
}
printf("\n");
exit(EXIT_SUCCESS);
}
输出:
91
2019
2410
11784
9139
5858
5293
17558
16625
3069
使用 getrandom
函数在 C 语言中生成随机数
getrandom
是一个 Linux 特有的函数,用于获取随机比特,其质量远远高于之前提供的两种方法。getrandom
需要三个参数-void
指针,指向应该存储随机比特的缓冲区,缓冲区的字节大小,以及特殊功能的标志。
在下面的例子中,我们生成一个无符号的整数,其中&tmp
的地址被传递为存储随机位的缓冲区,大小用 sizeof
运算符计算。在极少数情况下,getrandom
检索位的随机性来源可以不初始化。对 getrandom
函数的调用将阻止程序的执行。因此,GRND_NONBLOCK
宏定义作为第三个参数传递给函数,以便在这些情况下立即返回错误值 -1
。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/random.h>
#define MAX 100000
#define SIZE 100
#define NUMS_TO_GENERATE 10
int main() {
unsigned int tmp;
getrandom(&tmp, sizeof(unsigned int), GRND_NONBLOCK) == -1 ?
perror("getrandom") : "";
printf("%u\n", tmp);
exit(EXIT_SUCCESS);
}
934103271
相关文章
Go 中的随机数生成
发布时间:2023/04/27 浏览次数:114 分类:Go
-
本篇文章介绍如何在 Go 语言中使用随机数生成功能。Go 中的随机数生成 Go 语言为随机数生成功能提供内置支持。 内置包 math 有方法 rand(),用于随机数生成。
如何用 JavaScript 在两个数字之间生成一个随机数
发布时间:2023/03/10 浏览次数:125 分类:JavaScript
-
本教程介绍了如何用 JavaScript 在两个数字之间生成一个随机数。
在 JavaScript 中生成指定范围内的随机数
发布时间:2023/03/10 浏览次数:137 分类:JavaScript
-
本教程介绍了如何在 JavaScript 中的指定范围内生成随机数。我们将使用 `Math.random()` 函数生成随机数,然后将其移动到指定范围内的数字。
Go 生成一个范围内的随机数
发布时间:2023/01/16 浏览次数:195 分类:Go
-
Golang 在标准库中内置了对随机数生成的支持。 具体来说,有实现伪随机数生成器的 math/rand 包。 但是,没有在两个定义值之间生成随机整数的函数。 但是有一个生成一个介于零和最大
在 Python 中生成 X 和 Y 之间的随机数
发布时间:2022/12/08 浏览次数:133 分类:Python
-
使用 random.randint() 方法生成 X 和 Y 之间的随机数,例如 random_int = randint(1, 10) 。 randint() 方法采用 a 和 b 参数并返回指定范围内的随机整数,包括两个端点。 from random import randint, unifor
在 React 中生成一个随机数
发布时间:2022/09/14 浏览次数:288 分类:React
-
使用 Math.random() 函数在 React 中生成一个随机数,例如 Math.floor(Math.random() * (max - min + 1)) + min。 Math.random 函数返回 0 到小于 1 范围内的数字,但也可用于生成特定范围内的数字。