Scala中是否存在Java 8或更高版本中的等效内容?
Seq.fill(n)(Random.nextInt)
答案 0 :(得分:6)
您可以使用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.Random
的API来使用自己的随机位源,例如能够获取不同分布的各种基元的值,以及不同类型,范围和长度的流。< / p>
答案 1 :(得分:3)
可能比Random.ints()
稍近一些,就像这样:
Stream
.generate(rnd::nextInt)
.limit(n)
.collect(toList());
更接近&#34;从某种意义上说,如果忽略了轻微的语法差异以及Seq
与List
的区别,Scala版本和此版本都会以签名函数统一
(Int, Unit => T) => Seq[T]
适用于任何T
:
(n, f) => Stream.generate(f).limit(n).collect(toList())
(n, f) => Seq.fill(n)(f)
与Random.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);
}
}