如何使用GMP生成随机数并实现按钮点击更新?重复生成问题求助
问题解决:点击按钮生成随机数重复的问题
问题根源
你每次调用gmp_randseed_ui(rnd, 100000U)时使用了固定的种子值,GMP的MT随机数生成器会从这个固定种子开始生成完全相同的随机序列,因此每次点击按钮得到的随机数都一致。
修正方案
- 替换固定种子为动态值:使用每次都不同的数据源作为种子,比如当前时间的高精度计时值,确保每次生成的随机序列唯一。
- 补充资源释放逻辑:GMP的
mpz_t和gmp_randstate_t对象需要手动销毁,否则会导致内存泄漏。
修改后的代码示例
private void BtnCreateKey(object sender, RoutedEventArgs e) { mpz_t modulo = new mpz_t(); mpz_t basis = new mpz_t(); mpz_t alicePrivate = new mpz_t(); mpz_t bobPrivate = new mpz_t(); mpz_t privateKeyAlice = new mpz_t(); mpz_t privateKeyBob = new mpz_t(); mpz_t sharedSecretKeyAlice = new mpz_t(); mpz_t sharedSecretKeyBob = new mpz_t(); mpz_t exchangeKeyAlice = new mpz_t(); mpz_t exchangeKeyBob = new mpz_t(); gmp_randstate_t rnd = new gmp_randstate_t(); gmp_lib.gmp_randinit_mt(rnd); // 使用当前时间的Ticks作为动态种子,确保每次种子唯一 ulong seed = (ulong)DateTime.Now.Ticks; gmp_lib.gmp_randseed_ui(rnd, seed); // 初始化mpz变量 gmp_lib.mpz_init(alicePrivate); gmp_lib.mpz_init(bobPrivate); gmp_lib.mpz_init(modulo); gmp_lib.mpz_init(basis); gmp_lib.mpz_init(privateKeyAlice); gmp_lib.mpz_init(privateKeyBob); gmp_lib.mpz_init(exchangeKeyAlice); gmp_lib.mpz_init(exchangeKeyBob); gmp_lib.mpz_init(sharedSecretKeyAlice); gmp_lib.mpz_init(sharedSecretKeyBob); // 生成随机数 gmp_lib.mpz_urandomb(modulo, rnd, 32); gmp_lib.mpz_urandomb(basis, rnd, 8); gmp_lib.mpz_urandomb(alicePrivate, rnd, 16); gmp_lib.mpz_urandomb(bobPrivate, rnd, 16); // 释放所有GMP资源,避免内存泄漏 gmp_lib.mpz_clear(modulo); gmp_lib.mpz_clear(basis); gmp_lib.mpz_clear(alicePrivate); gmp_lib.mpz_clear(bobPrivate); gmp_lib.mpz_clear(privateKeyAlice); gmp_lib.mpz_clear(privateKeyBob); gmp_lib.mpz_clear(exchangeKeyAlice); gmp_lib.mpz_clear(exchangeKeyBob); gmp_lib.mpz_clear(sharedSecretKeyAlice); gmp_lib.mpz_clear(sharedSecretKeyBob); gmp_lib.gmp_randclear(rnd); }
额外说明
DateTime.Now.Ticks返回从0001年1月1日以来的100纳秒间隔数,每次调用都会产生不同的值,能有效保证种子的随机性。- 所有通过
mpz_init初始化的变量,必须对应调用mpz_clear销毁;gmp_randinit_mt初始化的随机状态,必须调用gmp_randclear销毁。
内容的提问来源于stack exchange,提问作者Utility Monster
相关产品推荐
相关产品推荐

