c++ - GMP 卡在生成相同的随机整数
问题描述
我想生成一个 n 字节的随机整数 z 使得
2^(n-1) <= z <= 2^n - 1
每当我运行以下代码 gmp 吐出相同的确切整数时,我做错了什么?
// Random int of n bits.
const auto n_bits = 1024;
mpz_t mpz_int;
gmp_randstate_t state;
mpz_init(mpz_int);
gmp_randinit_default(state);
mpz_rrandomb(mpz_int, state, n_bits);
std::cout<<"Random int generated:"<<std::endl;
std::cout<<mpz_get_str(nullptr, 10, mpz_int)<<std::endl;
mpz_rrandomb
仅当我更改n_bits
参数时才会更改输出。我在 Ubuntu 和 MacOS 上试过这个。我也试过mpz_urandomb
——同样的问题。我假设我错过了一些初始化,我已经阅读了几个小时的 gmp 文档,但我找不到上述方法不起作用的原因。
为了重现,将上面的代码填充到主函数中,使用标志编译:
g++ main.cpp -O2 -Wall -std=c++14 -lstdc++ -lgmp -lgmpxx
谢谢你。
解决方案
gmp_randinit_default
显然将种子设置为某个固定值。您应该调用gmp_randseed
或gmp_randseed_ui
之后将种子设置为您自己的值,这在每次运行时都不相同。
对于初始测试,您可以尝试gmp_randseed_ui(state, getpid())
. getrandom()
在 Linux 上,您可以通过调用或阅读来获得更多随机种子/dev/urandom
。不确定 MacOS 上提供了哪些。
推荐阅读
- python - 无法在 Python 中提取加密的 Zip 文件
- php - Laravel 5.5:使用 Join 和 Where 子句构建查询
- python - 缺少模块“awx.main.db”
- c++ - 在 C++ 中用 lambda 替换函数
- sql - 在 bigquery 的 2 列中拆分一行
- javascript - 需要从 Chrome 开发工具捕获性能监视器详细信息到 Java 程序中
- html - HTML - 运行命令行?
- ruby-on-rails - 尝试通过按下按钮将参数传递给控制器时出现 ActiveRecord::RecordNotFound(找不到没有 ID 的请求)错误
- angular - 嵌入包含更多内容的内容以嵌入到子组件中
- php - 在后台覆盖 AdminHtml 控制器