c++ - 随机数生成器冻结
问题描述
我有一个我制作的程序,它为端口选择一个随机数来接收 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 并且它停止。
我不能用秒来充当我的种子,因为它同时运行程序的许多实例,我有很多程序通过生成相同的随机数而发生冲突。
有没有更好的方法来获得随机性?
解决方案
您应该使用<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.
推荐阅读
- python - 我如何知道图像是否完全出现在 Python 中?
- c# - 传递X,Y点的指数值时路径未显示在android画布中
- c++ - 如何从 void loop arduino 中的另一个函数调用循环中的函数
- angular - 如何使用可观察模式从 subsribe 方法返回结果
- python - SQLalchemy method=multi 不起作用,出现错误 sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY000', 'The driver did not supply an error!')
- c++ - (c++)你可以嵌套来自外部源的命名空间吗
- flutter - 无法加载内核二进制文件:Flutter 中的 SDK 哈希无效
- echarts - 是否可以向 echartsInstance.appendData 添加多个对象?
- vba - 请协助如何让每个组合框显示自己的列表然后被过滤
- javascript - onclick 更改背景添加代码,但仅在第二次单击后更改