如何确保随机数是唯一的而不是重复的?

我有一个简单的代码可以生成随机数

SecureRandom random = new SecureRandom();

...

public int getRandomNumber(int maxValue) {

return random.nextInt(maxValue);

}

上面的方法被调用大约10次(不是循环的)。我想确保所有数字都是唯一的(假设maxValue > 1000)。

我可以确定每次呼叫都会得到唯一的号码吗?如果没有,我该如何解决?

编辑:我可能已经含糊其词了。我想避免手动检查,如果我真的有唯一的数字,所以我想知道是否有更好的解决方案。

回答:

有多种方法可以实现这一目标,哪种方法更合适,取决于您需要从多少个数字中选择。

  • 如果要从大量潜在数字中选择少量的随机数,则最好将先前选择的数字存储在一组中,然后“手动”检查重复项。在大多数情况下,您实际上不会获得任何重复,并且从实际角度而言,该测试的成本实际上为零。听起来可能并不雅致,但实际上并不像听起来那么糟糕。
  • 一些基本的随机数生成算法不会在其“原始”级别上生成重复项。因此,例如,一种称为XORShift生成器的算法可以有效地产生一定范围内的所有数字,将其改组为无重复项。因此,您基本上可以从序列中选择一个随机的起点,然后只生成下一个n个数字,就知道不会重复。但是在这种情况下,您不能随意选择“最大值”:它必须是所讨论生成器的自然最大值。
  • 如果可能的数字范围很小,但是您需要选择的数字数量在该范围的几个数量级以内,那么您可以将其视为随机 选择 问题。例如,要在10,000,000范围内选择100,000个数字而不重复,可以执行以下操作:

令m为到目前为止我选择的随机数

对于i = 1至10,000,000

生成0-1范围内的随机(浮点)数r

如果(r <(100,000-m)/(10,000,000-i)),则将i添加到列表中并递增m

随机排列列表,然后根据需要从列表中顺序选择数字

但是很明显,如果您需要选择整个数字范围中相当大的一部分,那么选择后者就没有多大意义了。如果要选择1到10亿范围内的10个数字,那么当您仅通过检查重复项来生成十亿个随机数时,您实际上就不太可能获得重复项,而最终只能生成10个随机数数字。

以上是 如何确保随机数是唯一的而不是重复的? 的全部内容, 来源链接: utcz.com/qa/432539.html

回到顶部