Java - 创建具有给定范围的IntStream,然后使用map函数随机化每个元素

Sne*_*ike 5 java random java-8 java-stream

所以我创建了一个IntStream,我给它一个1到9的范围.我希望能够使用map函数来获取给定范围内的每个元素(1-9)并随机化每个元素.

基本上我想在每次运行程序时以不同的顺序流式传输数字1 - 9.(我对其他想法持开放态度,但必须使用流).

我听说过使用Java的Random类,但我不确定如何在每个元素的映射上实现它.

我试过这样做,但有错误:

 IntStream.range(1, 9).map(x -> x = new Random()).forEach(x -> System.out.println(x));
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

Jua*_*oza 10

它也可以通过以下方式完成Random.ints:

new Random().ints(1,10)
        .distinct()
        .limit(9)
        .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

输出:

9 8 4 2 6 3 5 7 1

编辑

如果您需要Stream带有值,请执行以下操作:

Stream<Integer> randomInts = new Random().ints(1, 10)
        .distinct()
        .limit(9)
        .boxed();
Run Code Online (Sandbox Code Playgroud)

如果您需要List带有值,请执行以下操作:

List<Integer> randomInts = new Random().ints(1, 10)
        .distinct()
        .limit(9)
        .boxed()
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • @DodgyCodeException:实际上,我们知道`Random`不是真正随机的,而是使用规范中修复的算法.我们可以安全地假设它总是会遇到1到10之间的所有值. (3认同)
  • @JuanCarlosMendoza不,如果`Random`是*真正*随机,那么序列5 5 5 5 5 5 5 5 5 5与8 4 7 5 6 9 3 5 1 2同样可能(或者你的掷骰子给出的任何东西)您).可以*用真正随机的数字来获得相同数字(或同一组数字)的极长序列.然而,正如霍尔格正确地指出的那样,"随机"并不是真正随机的,我们知道我们可以依靠它生成从1到9的所有数字. (2认同)
  • @ GR412这个自定义列表有什么重要意义?有什么问题`List <Integer> list = new Random().ints(1,10).distinct().limit(9).boxed().collect(Collectors.toList());`? (2认同)

Swe*_*per 5

Streams真的不适合这份工作.就像,真的 真的.

更好的方法是使用Collections.shuffle:

// you can replace this with however you want to populate your array. 
// You can do a for loop that loops from 1 to 9 and add each number.
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
Collections.shuffle(list);
// now "list" is in a random order
Run Code Online (Sandbox Code Playgroud)

编辑:

现在我知道你有一个自定义列表,这是另一种方法.编写两种方法将自定义列表转换​​为法线ArrayList,反之亦然.将您的自定义列表转换​​为a ArrayList,执行shuffle并将其转换回来.

只是为了好玩,Stream当平行时,可以按随机顺序生成东西,但不是真的.

我运行了这个代码10次:

IntStream.range(1, 10).parallel().forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)

以下是输出:

347195628
342179856
832497165
328194657
326479581
341287956
873629145
837429156
652378914
632814579
Run Code Online (Sandbox Code Playgroud)