微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决GMP 卡在生成相同的随机整数

我想生成一个 n 字节的随机整数 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 上提供了哪些。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。