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

生成指定数量小于P的BigInteger时的异常问题及解决

问题分析与修复

你的代码出现数量超标、存在大于P的元素这两个问题,根源是错误使用了ArrayList.add(int index, E element)方法:

  • 每次do-while循环都会执行插入操作,若生成的数大于P,重复插入会让列表累积大量无效元素,最终长度远超players。
  • 无效元素会留在列表中,导致结果里混有大于P的数,同时数量超标。

正确实现代码

先生成临时变量验证合法性,符合条件后再添加到列表:

ArrayList<BigInteger> C = new ArrayList<>(players);
Random random = new Random(); // 确保Random实例已初始化

for (int i = 0; i < players; i++) {
    BigInteger tempNum;
    do {
        tempNum = new BigInteger(64, random);
    } while (tempNum.compareTo(P) >= 0); // 严格小于P,若允许等于可改为>0
    C.add(tempNum);
}

核心改进点

  • 用临时变量存储生成的数,避免反复插入列表导致元素堆积。
  • 直接调用add(tempNum)在列表末尾追加元素,无需索引操作,逻辑更清晰。
  • 循环条件用>=0确保生成的数严格小于P,覆盖等于P的边界情况。

高效优化方案(可选)

如果P的二进制位数≤64,可通过指定生成位数减少重试次数,提升效率:

ArrayList<BigInteger> C = new ArrayList<>(players);
Random random = new Random();

for (int i = 0; i < players; i++) {
    BigInteger tempNum;
    // 按P的位数生成,减少大于P的概率
    do {
        tempNum = new BigInteger(P.bitLength(), random);
    } while (tempNum.compareTo(P) >= 0);
    C.add(tempNum);
}

内容的提问来源于stack exchange,提问作者Rume Diablo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:35:36