首页 > 解决方案 > 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

谢谢你。

标签: c++gmp

解决方案


gmp_randinit_default显然将种子设置为某个固定值。您应该调用gmp_randseedgmp_randseed_ui之后将种子设置为您自己的值,这在每次运行时都不相同。

对于初始测试,您可以尝试gmp_randseed_ui(state, getpid()). getrandom()在 Linux 上,您可以通过调用或阅读来获得更多随机种子/dev/urandom。不确定 MacOS 上提供了哪些。


推荐阅读