Java : Random (乱数) - API使用例

Random (Java SE 17 & JDK 17) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

クラス構成

Randomクラスは、一連の疑似乱数を生成します。

final var random = new Random();

IntStream.range(0, 10).forEach(i -> {
    // 0 ~ 999 の乱数を生成します。
    final var value = random.nextInt(1000);
    System.out.println(value);
});

// 結果
// ↓
//842
//947
//117
//930
//586
//634
//48
//754
//615
//538

乱数ジェネレータ・アルゴリズムの選択
ランダム(LCG)は、使用可能なアルゴリズムの最も脆弱であり、ユーザーが新しいアルゴリズムに移行することをお薦めします。アプリケーションで暗号化的にセキュアである乱数ジェネレータ・アルゴリズムが必要な場合は、クラスSecureRandomのインスタンスを使用し続ける必要があります。

Randomクラスは古い乱数生成アルゴリズムが使われています。

Java 17 から、新しい乱数生成アルゴリズムが選択できる RandomGenerator が追加されました。
API仕様では、新しいアルゴリズムを使うことがおすすめされています。

また、より強力な乱数が必要となる場合…例えば、暗号化で使う初期化ベクトル(IV)の生成などは、

を代わりに使うことも検討しましょう。

コンストラクタ

Random ()

新規乱数ジェネレータを作成します。

コンストラクタになにも指定しないと、毎回違う一連の乱数を生成します。

final var randomA = new Random();
randomA.ints(5).forEach(System.out::println);

// 結果
// ↓
//-841255616
//-429008669
//1410901662
//-1564542540
//580020011

final var randomB = new Random();
randomB.ints(5).forEach(System.out::println);

// 結果
// ↓
//545903664
//-1228814490
//1828005830
//580827886
//-1850876258

Random (long seed)

単一のlong型のシードを使って、新しい乱数ジェネレータを作成します。

同じシードを使うと、同じ一連の疑似乱数を生成します。
つまり、乱数を再現することができます。

final var seed = 1L;

final var randomA = new Random(seed);
randomA.ints(5).forEach(System.out::println);

// 結果
// ↓
//-1155869325
//431529176
//1761283695
//1749940626
//892128508

final var randomB = new Random(seed);
randomB.ints(5).forEach(System.out::println);

// 結果
// ↓
//-1155869325
//431529176
//1761283695
//1749940626
//892128508

メソッド

DoubleStream doubles ()

0(含む)から1(含まない)までの擬似乱数 double値を含む、事実上無制限のストリームを返します。

final var random = new Random();

final var stream = random.doubles();
stream.limit(5).forEach(System.out::println);

// 結果
// ↓
//0.9933971955304746
//0.1483121246786262
//0.08813398340371925
//0.2371977856503633
//0.4369634515475669

DoubleStream doubles (double randomNumberOrigin, double randomNumberBound)

指定された起点(含む)と境界(含まない)に準拠した擬似乱数 double値を含む、事実上無制限のストリームを返します。

final var random = new Random();

final var stream = random.doubles(-2.0, 2.0);
stream.limit(10).forEach(System.out::println);

// 結果
// ↓
//0.46669107214800976
//1.823982612104178
//-1.0023020499122088
//1.557809549013963
//-1.8460889354201009
//1.580609013740684
//-1.9844530745601592
//1.6292569996897277
//0.8971618701335204
//-0.2060437417207921

DoubleStream doubles (long streamSize)

0(含む)から1(含まない)までの擬似乱数double値を、指定されたstreamSize数だけ生成するストリームを返します。

final var random = new Random();

final var stream = random.doubles(5);
stream.forEach(System.out::println);

// 結果
// ↓
//0.6069609094487831
//0.1041672960050839
//0.9408040476538043
//0.3550482245920191
//0.01859977291581849

DoubleStream doubles (long streamSize, double randomNumberOrigin, double randomNumberBound)

指定された起点(含む)と境界(含まない)に準拠した擬似乱数double値を、指定されたstreamSize数だけ生成するストリームを返します。

final var random = new Random();

final var stream = random.doubles(10, -2.0, 2.0);
stream.forEach(System.out::println);

// 結果
// ↓
//0.12394741420391142
//1.715446838272169
//-0.7602225000178544
//1.396642879771861
//-0.12330350387046352
//1.6982792721646134
//-0.22836900988449882
//0.4818543322048803
//1.537344284465561
//-0.5734181028132959

IntStream ints ()

擬似乱数int値を含む、事実上無制限のストリームを返します。

final var random = new Random();

final var stream = random.ints();
stream.limit(5).forEach(System.out::println);

// 結果
// ↓
//-387527003
//1501625326
//1043996810
//248435097
//-1490084866

IntStream ints (int randomNumberOrigin, int randomNumberBound)

指定された起点(含む)と境界(含まない)に準拠した擬似乱数 int値を含む、事実上無制限のストリームを返します。

final var random = new Random();

final var stream = random.ints(-20, 20);
stream.limit(10).forEach(System.out::println);

// 結果
// ↓
//-11
//10
//-16
//-11
//-5
//5
//-4
//16
//-4
//-20

IntStream ints (long streamSize)

擬似乱数int値を、指定されたstreamSize数だけ生成するストリームを返します。

final var random = new Random();

final var stream = random.ints(5);
stream.forEach(System.out::println);

// 結果
// ↓
//1274439095
//-555311190
//-560506878
//1556824651
//1395678367

IntStream ints (long streamSize, int randomNumberOrigin, int randomNumberBound)

指定された起点(含む)と境界(含まない)に準拠した擬似乱数int値を、指定されたstreamSize数だけ生成するストリームを返します。

final var random = new Random();

final var stream = random.ints(10, -20, 20);
stream.forEach(System.out::println);

// 結果
// ↓
//4
//18
//-14
//-19
//-7
//4
//-8
//14
//-20
//-7

LongStream longs ()

擬似乱数long値を含む、事実上無制限のストリームを返します。

final var random = new Random();

final var stream = random.longs();
stream.limit(5).forEach(System.out::println);

// 結果
// ↓
//-2593912032996472717
//6165299436042818497
//7459575653066080807
//1821618543822402933
//-7464300688093417511

LongStream longs (long streamSize)

擬似乱数long値を、指定されたstreamSize数だけ生成するストリームを返します。

final var random = new Random();

final var stream = random.longs(5);
stream.forEach(System.out::println);

// 結果
// ↓
//-8771583458493279999
//4087852178343636982
//-712956439607902834
//-5729178964099416988
//4678616029229920469

LongStream longs (long randomNumberOrigin, long randomNumberBound)

指定された起点(含む)と境界(含まない)に準拠した擬似乱数 long値を含む、事実上無制限のストリームを返します。

final var random = new Random();

final var stream = random.longs(-20, 20);
stream.limit(10).forEach(System.out::println);

// 結果
// ↓
//-11
//-7
//18
//-13
//-17
//-5
//3
//-20
//13
//0

LongStream longs (long streamSize, long randomNumberOrigin, long randomNumberBound)

指定された起点(含む)と境界(含まない)に準拠した擬似乱数longを、指定されたstreamSize数だけ生成するストリームを返します。

final var random = new Random();

final var stream = random.longs(10, -20, 20);
stream.forEach(System.out::println);

// 結果
// ↓
//19
//-9
//-11
//2
//-10
//-4
//16
//-6
//2
//11

protected int next (int bits)

次の擬似乱数を生成します。
このメソッドは、ほかのすべてのメソッドによって使われるので、サブクラスによってオーバーライドされます。

オーバーライド用のメソッドです。
直接使うことはないと思いますので、API使用例は割愛します。

boolean nextBoolean ()

この乱数ジェネレータのシーケンスを使って、一様分布のboolean型の次の擬似乱数値を返します。

final var random = new Random();

IntStream.range(0, 5).forEach(i -> {
    final var value = random.nextBoolean();
    System.out.println(value);
});

// 結果
// ↓
//true
//true
//false
//true
//false

void nextBytes (byte[] bytes)

ランダム・バイトを生成し、ユーザー指定のバイト配列に配置します。

final var random = new Random();

final var bytes = new byte[10];
random.nextBytes(bytes);

// [86, -2, -56, -114, 56, -114, 13, 55, 104, 29]
System.out.println(Arrays.toString(bytes));

random.nextBytes(bytes);

// [-67, 44, 80, -39, 9, 38, 60, 49, 67, 127]
System.out.println(Arrays.toString(bytes));

double nextDouble ()

この乱数ジェネレータのシーケンスを使って、0.0から1.0の範囲で一様分布のdouble型の次の擬似乱数値を返します。

final var random = new Random();

IntStream.range(0, 5).forEach(i -> {
    final var value = random.nextDouble();
    System.out.println(value);
});

// 結果
// ↓
//0.612952216727897
//0.7367017962886943
//0.3850142745997098
//0.6757458526953953
//0.5978931541933749

float nextFloat ()

この乱数ジェネレータのシーケンスを使って、0.0から1.0の範囲で一様分布のfloat型の次の擬似乱数値を返します。

final var random = new Random();

IntStream.range(0, 5).forEach(i -> {
    final var value = random.nextFloat();
    System.out.println(value);
});

// 結果
// ↓
//0.3875636
//0.9419651
//0.35063696
//0.75571376
//0.35421652

double nextGaussian ()

この乱数ジェネレータのシーケンスを使って、平均0.0、標準偏差1.0のガウス(「正規」)分布のdouble型の擬似乱数値を返します。

final var random = new Random();

IntStream.range(0, 5).forEach(i -> {
    final var value = random.nextGaussian();
    System.out.println(value);
});

// 結果
// ↓
//-0.982573556204939
//0.6108520447839247
//1.4606584096086386
//0.5642834099747783
//-0.2853352253670542

int nextInt ()

この乱数ジェネレータのシーケンスを使って、一様分布のint型の次の擬似乱数値を返します。

final var random = new Random();

IntStream.range(0, 5).forEach(i -> {
    final var value = random.nextInt();
    System.out.println(value);
});

// 結果
// ↓
//253911642
//569627001
//-299685362
//1499873563
//-757847850

int nextInt (int bound)

この乱数ジェネレータのシーケンスを使って、0から指定された値の範囲(0は含むが、その指定された値は含まない)で一様分布のint型の擬似乱数値を返します。

final var random = new Random();

IntStream.range(0, 10).forEach(i -> {
    final var value = random.nextInt(1000);
    System.out.println(value);
});

// 結果
// ↓
//842
//947
//117
//930
//586
//634
//48
//754
//615
//538

long nextLong ()

この乱数ジェネレータのシーケンスを使って、一様分布のlong型の次の擬似乱数値を返します。

final var random = new Random();

IntStream.range(0, 5).forEach(i -> {
    final var value = random.nextLong();
    System.out.println(value);
});

// 結果
// ↓
//622295099449075800
//-4149873296563324808
//-8567274942269278677
//5245993659038234640
//4681780131712481383

void setSeed (long seed)

単一のlong型のシードを使って、この乱数ジェネレータのシードを設定します。

final var random = new Random(1);
random.ints(5).forEach(System.out::println);

// 結果
// ↓
//-1155869325
//431529176
//1761283695
//1749940626
//892128508

random.setSeed(1);
random.ints(5).forEach(System.out::println);

// 結果
// ↓
//-1155869325
//431529176
//1761283695
//1749940626
//892128508

RandomGeneratorで宣言されたメソッド

isDeprecated, nextDouble, nextDouble, nextExponential, nextFloat, nextFloat, nextGaussian, nextInt, nextLong, nextLong

Java API 使用例 : RandomGenerator」をご参照ください。


関連記事

ページの先頭へ