我需要生成介于0(含)到n(不含)之间的任意大随机整数。我最初的想法是调用nextDoublen并乘以n,但是一旦n变得大于2 53,结果将不再均匀分布。
BigInteger 具有以下可用的构造函数:
public BigInteger(int numBits, Random rnd)
构造一个随机生成的BigInteger,该整数均匀地分布在0到(2 numBits -1)(包括0和2 )之间。
如何使用它来获取0-n范围内的随机值,其中n不是2的幂?
使用循环:
BigInteger randomNumber;
do {
randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);
平均而言,这将需要少于两次的迭代,并且选择将是统一的。
编辑:如果您的RNG昂贵,则可以通过以下方式限制迭代次数:
int nlen = upperLimit.bitLength();
BigInteger nm1 = upperLimit.subtract(BigInteger.ONE);
BigInteger randomNumber, temp;
do {
temp = new BigInteger(nlen + 100, randomSource);
randomNumber = temp.mod(upperLimit);
} while (s.subtract(randomNumber).add(nm1).bitLength() >= nlen + 100);
// result is in 'randomNumber'
使用此版本,极不可能发生循环不止一次(在2 ^ 100中小于一次机会,即,比主机在下一秒内自发着火的可能性小)。另一方面,该mod()操作的计算量很大,因此该版本可能比以前的版本慢,除非randomSource
实例异常慢。
问题内容: 我不确定如何使用BigInteger类在Java中生成随机的n位整数。 问题答案: 然后您可以使用它:
问题内容: 在java中如何生成随机数? 问题答案: 在Java 1.7或更高版本中,执行此操作的标准方法如下: 请参阅相关的JavaDoc。这种方法的优点是不需要显式初始化java.util.Random实例,如果使用不当,可能会引起混乱和错误。 但是,相反,没有办法明确设置种子,因此在有用的情况下(例如测试或保存游戏状态或类似情况),很难重现结果。在这种情况下,可以使用下面显示的Java 1.
每当我看到这行代码 后面总是有一个很长的序列号..这个数字是如何产生的?如果我想随机生成这个值,我该怎么做呢?谢谢你的帮助。
问题内容: 我想生成一个随机时间戳,并向其添加一个随机增量,以生成第二个时间戳。那可能吗? 如果我传递随机的long值来创建时间戳,并且我想随机生成该long值,那么生成该值以给出2012年的时间戳的约束是什么? 问题答案: 您需要将随机数缩放到特定年份的范围,然后将年份的开始添加为偏移量。一年中的毫秒数从一年到另一年(le年有额外的一天,某些年份有leap分钟,依此类推),因此您可以按以下步骤确
问题内容: 我正在尝试在short原始数据类型的范围内(-32768,32767)生成随机整数。java Random对象仅生成正数。我将如何在该间隔内随机创建数字?谢谢。 问题答案: 您随机选择,然后减去
问题内容: Go的库缺少生成64位数字的功能。大约四年来这是一个未解决的问题。同时,解决方法是什么样的? 问题答案: 最简单的方法是拨打两次: 另一个选择是调用(在Go 1.7中添加了 )以读取8个字节,然后使用该包从中获取值: 注意:作为状态文档,它始终读取与传递的切片长度相同的字节,并且始终返回错误,因此在这种情况下无需检查错误。 注意#2:您也可以使用代替,因为我们正在使用其所有字节生成一个