Java での乱数の生成

ラップトップと複数のモニターでコードを書きながら、眼鏡をかけている男性。

サリンヤ・ピンガム/ EyeEm /ゲッティイメージズ





一連の生成 乱数 は、時々発生する一般的なタスクの 1 つです。の ジャワ 、java.util.Random クラスを使用するだけで簡単に実現できます。

あらゆる API の使用と同様に、最初のステップ クラス 、プログラムクラスの開始前に import ステートメントを配置することです。



次に、Random オブジェクトを作成します。

Random オブジェクトは、単純な乱数ジェネレーターを提供します。オブジェクトのメソッドは、乱数を選択する機能を提供します。たとえば、nextInt() および nextLong() メソッドは、それぞれ int および long データ型の値 (負および正) の範囲内にある数値を返します。



返される数値は、ランダムに選択された int 値と long 値になります。

特定の範囲から乱数を選択する

通常、生成される乱数は、特定の範囲 (たとえば、1 から 40 までの範囲) である必要があります。この目的のために、 nextInt() メソッドは int パラメータも受け入れることができます。数値範囲の上限を示します。ただし、上限枚数は抽選枚数に含まれません。ややこしく聞こえるかもしれませんが、nextInt() メソッドはゼロから上に向かって機能します。例えば:

0 から 39 までの乱数のみを選択します。 1 で始まる範囲から選択するには、nextInt() メソッドの結果に 1 を追加するだけです。たとえば、1 から 40 までの数値を選択するには、結果に 1 を追加します。

範囲が 1 より大きい数値から始まる場合は、次のことを行う必要があります。



  • 上限枚数から開始枚数を引いて1を足す。
  • nextInt() メソッドの結果に開始番号を追加します。

たとえば、5 から 35 までの数値を選択するには、上限数は 35-5+1=31 になり、結果に 5 を追加する必要があります。

ランダムクラスはどのくらいランダムですか?

Random クラスは決定論的な方法で乱数を生成することを指摘しておく必要があります。ランダム性を生成するアルゴリズムは、シードと呼ばれる数に基づいています。シード数がわかっている場合、アルゴリズムから生成される数を把握することができます。これを証明するために、その日付の数字を使用します ニール・アームストロング シード番号として初めて月に降り立ちました (1969 年 7 月 20 日) :



誰がこのコードを実行しても、生成される「乱数」のシーケンスは次のようになります。

デフォルトでは、以下で使用されるシード番号:



1970 年 1 月 1 日からのミリ秒単位の現在の時刻です。通常、これはほとんどの目的に対して十分な乱数を生成します。ただし、同じミリ秒内に作成された 2 つの乱数ジェネレーターは、同じ乱数を生成することに注意してください。

また、セキュアな乱数ジェネレーターが必要なアプリケーション (ギャンブル プログラムなど) で Random クラスを使用する場合も注意が必要です。アプリケーションの実行時間に基づいてシード番号を推測できる場合があります。一般に、乱数が絶対的に重要なアプリケーションでは、Random オブジェクトに代わるものを見つけるのが最善です。特定のランダムな要素 (ボード ゲームのサイコロなど) が必要なほとんどのアプリケーションでは、問題なく動作します。