在Java中生成唯一的随机数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我试图获得0到100之间的随机数。但是我希望它们是唯一的,而不是按顺序重复。例如,如果我有5个数字,他们应该是82,12,53,64,32而不是82,12,53,12,32我使用这个,但它会在一个序列中产生相同的数字。

Random rand = new Random();
selected = rand.nextInt(100);
提问于
用户回答回答于
  • 列表结构中按顺序添加范围中的每个数字。
  • 随机播放它。
  • 拿第一个'n'。

这是一个简单的实现。这将从范围1-10打印3个唯一的随机数。

import java.util.ArrayList;
import java.util.Collections;

public class UniqueRandomNumbers {

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i=1; i<11; i++) {
            list.add(new Integer(i));
        }
        Collections.shuffle(list);
        for (int i=0; i<3; i++) {
            System.out.println(list.get(i));
        }
    }
}

正如马克·比尔斯在现在删除的答案中指出的那样,原始方法的第一部分是仅使用一个Random实例。

这就是导致数字相同的原因。Random当前时间以毫秒为单位播种一个实例。对于特定的种子值, “随机”实例将返回完全相同伪随机数序列。

用户回答回答于

利用Java 8+可以使用ints的方法Random来获得一个IntStream随机值,然后distinctlimit到流减少了许多独特的随机值。

ThreadLocalRandom.current().ints(0, 100).distinct().limit(5).forEach(System.out::println);

Random如果你需要这些方法,也有创建LongStreams和DoubleStreams的方法。

如果你想以一个随机的顺序在一个范围内的所有(或大量)数字,将所有的数字添加到一个列表中,洗牌并取得第一个n可能会更有效率,因为上面的例子目前已经实现通过在请求的范围内生成随机数并将它们传递给一组,这可能需要生成比通过限制的数量多得多的数据,因为生成一个新唯一数的概率随着每个数的减少而减少。这是另一种方式的例子:

List<Integer> range = IntStream.range(0, 100).boxed()
        .collect(Collectors.toCollection(ArrayList::new));
Collections.shuffle(range);
range.subList(0, 99).forEach(System.out::println);

扫码关注云+社区