在 Java 中生成唯一的随机数

新手上路,请多包涵

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

 Random rand = new Random();
selected = rand.nextInt(100);

原文由 Ömer Faruk AK 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 509
2 个回答
  • 列表 结构中按顺序添加范围内的每个数字。
  • 洗牌
  • 取第一个’n’。

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

 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(i);
        Collections.shuffle(list);
        for (int i=0; i<3; i++) System.out.println(list.get(i));
    }
}


正如 Mark Byers 在现已删除的答案中指出的那样,原始方法修复的第一部分是仅使用一个 Random 实例。

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

原文由 Andrew Thompson 发布,翻译遵循 CC BY-SA 4.0 许可协议

With Java 8+ you can use the ints method of Random to get an IntStream of random values then distinct and limit 将流减少为一些唯一的随机值。

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

Random 也有创建 LongStream s 和 DoubleStream s 的方法,如果你需要的话。

如果您想要一个范围内的所有(或大量)数字以随机顺序排列,那么将所有数字添加到列表中,打乱顺序,然后取第一个 n 可能会更有效,因为上面的示例当前已实现通过在请求的范围内生成随机数并将它们传递给一组(类似于 Rob Kielty 的回答),这可能需要生成比传递给 limit 的数量更多的数量,因为生成新的唯一数字的概率随着每个发现的数字而降低。这是另一种方式的示例:

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

原文由 Alex - GlassEditor.com 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题