簡體   English   中英

在Java中生成隨機整數列表(以類似Scala的方式)

[英]Generating a list of random Integers in Java (in a Scala-like fashion)

Scala中是否存在Java 8或更高版本中的等效內容?

Seq.fill(n)(Random.nextInt)

您可以使用Random.ints(n)生成n隨機數。 為了避免裝箱,你可能想把它們放到一個數組中:

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

如果你想要一個列表並且你不介意拳擊,你可以這樣做:

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

如果rnd是該類的實例,則使用java.util.Random定義的偽隨機數生成器。 對於大多數用途,這應該沒問題。 如果要使用不同的隨機源,可以覆蓋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來使用自己的隨機位源,例如能夠獲取不同分布中的各種基元的值,以及不同類型,范圍和長度的流。

也許有點接近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)

Random.ints()不同,此版本適用於更復雜的發行版,它實際上將長度限制為某個數字n ,就像Scala版本一樣。 根據您要對其執行的操作,您可以collectcollect到其他數據結構中,或者將其保留為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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM