C语言生成随机数:使用 /dev/random 和 /dev/unrandom
在 C 语言中,可以使用系统调用来访问 '/dev/random' 和 '/dev/unrandom' 设备文件,从而生成随机数。
以下是一个简单的示例程序,可以生成指定数量的随机数:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
int fd, n, i;
unsigned char buffer[BUFFER_SIZE];
if (argc != 2) {
printf("Usage: %s <number of random bytes>
", argv[0]);
return 1;
}
n = atoi(argv[1]);
fd = open("/dev/random", O_RDONLY);
if (fd < 0) {
fd = open("/dev/unrandom", O_RDONLY);
if (fd < 0) {
printf("Error: cannot open /dev/random or /dev/unrandom
");
return 1;
}
}
for (i = 0; i < n; i += BUFFER_SIZE) {
int bytes = (i + BUFFER_SIZE > n ? n - i : BUFFER_SIZE);
if (read(fd, buffer, bytes) != bytes) {
printf("Error: cannot read random bytes
");
return 1;
}
fwrite(buffer, 1, bytes, stdout);
}
close(fd);
return 0;
}
该程序首先尝试打开 '/dev/random' 设备文件,如果失败则尝试打开 '/dev/unrandom' 设备文件。然后使用 read 函数从设备文件中读取指定数量的随机字节,并将其写入标准输出。
需要注意的是,'/dev/random' 和 '/dev/unrandom' 设备文件的行为是不同的。'/dev/random' 设备文件会等待系统收集足够的随机熵(即随机事件),然后再生成随机数,因此在某些情况下可能会阻塞程序。而 '/dev/unrandom' 设备文件则不会等待随机熵,而是使用一些预设的伪随机数算法来生成随机数,因此它可能会生成的随机数比 '/dev/random' 设备文件更不安全。因此,建议在使用随机数时优先考虑使用 '/dev/random' 设备文件。
原文地址: http://www.cveoy.top/t/topic/nuWr 著作权归作者所有。请勿转载和采集!