代码之家  ›  专栏  ›  技术社区  ›  Daniel

在Java中生成随机整数列表(以类似Scala的方式)

  •  5
  • Daniel  · 技术社区  · 7 年前

    Java 8或更高版本中是否有与Scala中的以下内容等效的内容?

    Seq.fill(n)(Random.nextInt)
    
    2 回复  |  直到 7 年前
        1
  •  6
  •   Stuart Marks    7 年前

    您可以使用 Random.ints(n) 生成 n 随机数。为了避免装箱,您可能希望将它们放入一个数组中:

    int[] seq = rnd.ints(n).toArray();
    

    如果您想要一个列表,并且不介意拳击,可以这样做:

    List<Integer> list = rnd.ints(n).boxed().collect(toList());
    

    由定义的伪随机数生成器 java.util.Random 在以下情况下使用 rnd 是该类的实例。这在大多数情况下都是可以的。如果要使用不同的随机性源,可以覆盖 Random.next(bits) 从自定义源而不是内置生成器提供位。例如,可以执行以下操作:

    警告:这是一个可怕的伪随机数来源。不要使用它。这只是一个例子。

    class MyRandom extends Random {
        int state = 0;
        protected int next(int bits) {
            return state ^= 1;
        }
    }
    
    Random rnd = new MyRandom();
    int[] seq = rnd.ints(n).toArray();
    

    这允许您使用自己的随机位源,使用 Java语言util。随机的 ,例如能够获取不同分布中的各种原语的值,以及不同类型、范围和长度的流。

        2
  •  4
  •   Andrey Tyukin    7 年前

    可能比 Random.ints() 应该是这样的:

    Stream
      .generate(rnd::nextInt)
      .limit(n)
      .collect(toList());
    

    如果忽略了细微的句法差异 Seq vs。 List 区别在于,Scala版本和此版本都统一了签名功能

    (Int, Unit => T) => Seq[T]
    

    对于任何 T :

    (n, f) => Stream.generate(f).limit(n).collect(toList())
    (n, f) => Seq.fill(n)(f)
    

    不像 随机的ints() ,此版本适用于更复杂的分布,它实际上将长度限制为一些数字 n ,就像Scala版本一样。根据你想用它做什么,你可以 collect 将其转换为其他数据结构,或者将其保留为 Stream


    所有导入的完整演示:

    import java.util.stream.*;
    import java.util.Random;
    import java.util.List;
    import static java.util.stream.Collectors.toList;
    
    public class RandomListGeneration {
        public static void main(String args[]) {
            Random rnd = new Random();
            int n = 42;
            List<Integer> result = Stream
                .generate(rnd::nextInt)
                .limit(n)
                .collect(toList());
            System.out.println(result);
        }
    }