生成指定数量小于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
相关产品推荐
相关产品推荐

