You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用GMP生成随机数并实现按钮点击更新?重复生成问题求助

问题解决:点击按钮生成随机数重复的问题

问题根源

你每次调用gmp_randseed_ui(rnd, 100000U)时使用了固定的种子值,GMP的MT随机数生成器会从这个固定种子开始生成完全相同的随机序列,因此每次点击按钮得到的随机数都一致。

修正方案

  1. 替换固定种子为动态值:使用每次都不同的数据源作为种子,比如当前时间的高精度计时值,确保每次生成的随机序列唯一。
  2. 补充资源释放逻辑: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:25:27