C++和C中提供一个rand函数用来实现随机数的生成,但我们都清楚,这实际上生成的是一个伪随机数,那么如何生成一个真随机数呢?
什么是伪随机?
计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。
简单来讲,伪随机数在某些情况下是有规律可循的,在一个严格的程序中,这样的实现不可行的。
如何生成真随机数?
真随机数要求我们,生成的序列是不可预测的,那么如何得到一个不可预测的序列?由于人的行为是不可预测的,所以Linux内核通过测量用户的输入时间延迟作为随机数(例如鼠标操作和键盘输入)。
Linux中为我们提供了两个随机数设备:
- /dev/random :在用户没有输入操作时,阻塞随机读取进程
- /dev/urandom:永不阻塞,在用户没有输入操作时,生伪随机数替代。
代码实现
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
using namespace std;
int main()
{
FILE* f = fopen("/dev/urandom", "rb");
int pwd_int = 0;
char pwd_char[10];
cout << endl;
fread(&pwd_int, sizeof(int), 1, f);
fread(pwd_char, sizeof(char), 9, f);
cout << pwd_int << endl;
cout << pwd_char << endl;
cout << endl;
return 0;
}