首页 > 解决方案 > 随机数生成器冻结

问题描述

我有一个我制作的程序,它为端口选择一个随机数来接收 UDP 数据包。该程序使用 /dev/random 中的一些数据为 rand 函数播种。我循环获取数据 4 次以获得足够数量的 srand 数据。

这是我用来为 srand 生成数据的代码。

FILE *random_file = fopen("/dev/random","r");

std::string random_seed_str;
for(int i = 0; i < 3; i++) {
    int seed_element = getc(random_file);
    std::string element_string = std::to_string(seed_element);
    random_seed_str += element_string;
}

int random_seed = stoi(random_seed_str);

srand( random_seed );

现在,如果我一次从命令行运行我的程序,这可以正常工作。但是当我开始在我们为其设计的应用程序中使用它时,程序开始随机冻结在这一行:

int seed_element = getc(random_file);

运行它的应用程序以随机​​间隔运行程序并并行运行程序(一次最多 12 个实例)。

我能想到的唯一原因是如果同一程序的两个实例尝试同时通过 getc 访问 /dev/random 并且它停止。

我不能用秒来充当我的种子,因为它同时运行程序的许多实例,我有很多程序通过生成相同的随机数而发生冲突。

有没有更好的方法来获得随机性?

标签: c++

解决方案


您应该使用<random>标准库的模块:

#include <random> //import random module
std::random_device rd; //use a random device to seed
std::default_random_engine re; //use a random engine to generate random bytes
re.seed(rd()); //seed the random engine
re(); //now use the random bytes, you can also instantiate a distribution to have values following a specific distribution.

推荐阅读