C++ 访问Linux随机设备生成随机数

 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;
}

猜你喜欢

转载自blog.csdn.net/qq_43550173/article/details/113782066