JAVA中的随机数生成

JAVA中的随机数生成,java,algorithm,data-structures,Java,Algorithm,Data Structures,我知道JAVA Random类及其用法。但是我想生成一个随机数,在这个范围内的所有数字至少生成一次之前,不应该重复这个随机数。有谁能给我一些参考资料吗 在使用Random类时,我面临的问题是有些数字会重复2到3次,而有些则根本不会生成。。在这种情况下,我的应用程序可能会失败,因为我有另一个线程根据生成的数字处理一些请求……当出现延迟且下一个唯一数字不可用时,它会停止,而不处理未生成的数字……您可以生成范围内的所有值并将其洗牌Collections.shuffle()一旦使用了每个值,请重复 想象

我知道JAVA Random类及其用法。但是我想生成一个随机数,在这个范围内的所有数字至少生成一次之前,不应该重复这个随机数。有谁能给我一些参考资料吗


在使用Random类时,我面临的问题是有些数字会重复2到3次,而有些则根本不会生成。。在这种情况下,我的应用程序可能会失败,因为我有另一个线程根据生成的数字处理一些请求……当出现延迟且下一个唯一数字不可用时,它会停止,而不处理未生成的数字……

您可以生成范围内的所有值并将其洗牌
Collections.shuffle()
一旦使用了每个值,请重复

想象你有一副牌,你拿一副牌,每一张牌都有一次,你洗牌,你就会知道每一张牌都是随机的,只有一次。当一副牌完成后,您再次取出所有牌并重新洗牌(或换一副新牌并洗牌)

  • 创建一个包含该范围内所有可能的随机数的列表
  • 结果不是使用随机数,而是使用随机整数在列表中选择索引
  • 将其从列表中删除并返回

注意将随机整数的范围调整为当前列表大小(每次获得新数字时,它将减少一个)

您可以随身携带一份已挑选出的所有数字的列表,并检查新随机数是否在该列表中
对于提出相同问题的人

如果您的范围相对较小,并且您(可选)希望在处理完生成的值后支持“重用”,请使用ben75的答案。否则,Peter Lawrey的答案是正确的。可能的重复洗牌更好,因为它只在O(N)中执行一次,然后允许N O(1)次访问(如果您从列表中逐个提取N个随机元素,无论是链接的[由于访问时间]还是阵列备份的[由于提取时间],这都比O(N^2)好)