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

use*_*882 2 java random unique

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

SecureRandom random = new SecureRandom();
...
public int getRandomNumber(int maxValue) {
    return random.nextInt(maxValue);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nei*_*fey 5

有不同的方法来实现这一点,哪个更合适将取决于您需要从多少数量中选择多少数字.

  • 如果您从大量潜在数字中选择少量随机数,那么您最好只将先前选择的数字存储在一个集合中并"手动"检查重复数据.大多数情况下,您实际上不会获得重复,并且实际上测试的成本几乎为零.听起来可能不那么优雅,但实际上并不像听起来那么糟糕.
  • 一些基础随机数生成算法不会在其"原始"级别产生重复.因此,例如,称为XORShift生成器的算法可以有效地生成特定范围内的所有数字,无需重复就可以进行混洗.所以你基本上在序列中选择一个随机起点然后只生成下一个n个数字,你知道不会有重复.但在这种情况下你不能随意选择"max":它必须是所讨论的发生器的自然最大值.
  • 如果可能数字的范围很小,但您需要选择的数字的数量在该范围的几个数量级内,那么您可以将其视为随机选择问题.例如,要选择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亿个随机数,只要你去检查重复数据,你就不太可能真正得到重复数据,而且最终只会产生10个随机数数字.