GMP 卡住生成相同的随机整数

GMP stuck generating same random integers

我想生成一个 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 文档几个小时了,但我找不到上述方法不起作用的原因。

要重现,把上面的代码塞进main函数,用flags编译:

g++ main.cpp -O2 -Wall -std=c++14 -lstdc++ -lgmp -lgmpxx

谢谢。

gmp_randinit_default 显然将种子设置为某个固定值。您应该在之后调用 gmp_randseed or gmp_randseed_ui 将种子设置为您自己的值,该值在每个 运行.

上都不相同

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