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 上提供了哪些。
我想生成一个 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 上提供了哪些。