我期待随机化BigInteger。其目的是从1到8180385048之间挑选一个数字。但是,从我注意到的BigInteger(BitLen,Random)开始,它从n到-1,我想要一些不可预知的数字。我试图制定一种方法来做到这一点,但我一直在遇到bug,并最终屈服于这里询问。 :P有没有人有任何建议如何做到这一点?随机化BigInteger
回答
从Random.nextInt(int n)
的文档看,这显然需要解决同样的问题,他们似乎认为你不可能比“如果超出范围的情况下重新采样”做得更好,但是预计惩罚可以忽略不计。
从文档:
的算法是有点棘手。它拒绝会导致不均匀分布的值(由于n不能被n整除)。价值被拒绝的可能性取决于n。最坏的情况下为n = 2 30 +1,为此的概率拒绝为1/2,并且迭代的预期数目的循环终止之前是2
我建议你只需使用randomizing constructor你提到和迭代,直到你达到一个值,在范围内,比如像这样:
public static BigInteger rndBigInt(BigInteger max) {
Random rnd = new Random();
do {
BigInteger i = new BigInteger(max.bitLength(), rnd);
if (i.compareTo(max) <= 0)
return i;
} while (true);
}
public static void main(String... args) {
System.out.println(rndBigInt(new BigInteger("8180385048")));
}
对于你的具体情况(最大= 8180385048),不得不重申的可能性,甚至一次,约为4.8 %,所以不用担心: - )
谢谢。虽然,它会是“i.compareTo(max)<= 0”,因为我正在寻找一个等于或低于最大值的数字。否则,这是一个坚实的例子。 – Unrealomega 2010-09-17 14:02:00
啊,对,更新。您可能还想考虑到0是一个可能的返回值...正如您所说的从1到8180385048 – aioobe 2010-09-17 14:10:45
创建一个循环并获得随机的BigInteger
s覆盖范围的最小位长,直到获得一个范围内的数字。这应该保留随机数的分布。
哪个是他的具体情况会用bitLen == 33. – 2010-09-17 13:34:29
重申如果超出范围,正如其他答案中所建议的那样,这是解决此问题的方法。但是,如果你想避免这种情况,另一种选择是使用模运算符:
BigInteger i = new BigInteger(max.bitLength(), rnd);
i = i.mod(max); // Now 0 <= i <= max - 1
i = i.add(BigInteger.ONE); // Now 1 <= i <= max
这很可能会导致分布不均匀。 – 2010-09-17 18:48:06
对,这很可能会导致对较小值的偏见。这可能会或可能不会与原始发布者的应用程序相关。 – Grodriguez 2010-09-17 19:31:54
- 1. 随机化
- 2. 随机化或随机的阵列
- 3. 随机化身发电机
- 4. R:随机化data.frame
- 5. 代码随机化
- 6. 治疗随机化
- 7. 随机化为了
- 8. 随机化序列
- 9. 随机化功能
- 10. 无法随机化
- 11. 如何在vb.net中随机选择一个biginteger?
- 12. 安全地生成一致随机的BigInteger
- 13. 在vb.net中随机化()没有正确随机化
- 14. 在java中序列化BigInteger
- 15. 随机化数组元素
- 16. 随机化RichTextBox的行
- 17. uvm中的随机化
- 18. 随机化plist的内容
- 19. 如何随机化输出
- 20. 随机化和分层树
- 21. 随机化使用Boomerang.js
- 22. 优化随机T-SQL
- 23. 随机化NetworkX输出
- 24. 如何随机化Excel行
- 25. Windows 8堆随机化
- 26. 随机化数字SQL
- 27. 随机化大写字母
- 28. 用jQuery随机化数字?
- 29. 如何随机化切片?
- 30. Windows中的堆随机化
不是X^2 -1,而是2 ** bitLen -1,其中**是幂运算符。 – 2010-09-17 13:31:14