ランダムクラス(java.util)
ランダムクラスで実装されているランダムアルゴリズムは、擬似ランダム、つまりルールのランダムです。ランダム化を実行する場合、ランダムアルゴリズムの起源の数はシードと呼ばれ、種子に基づいて特定の変換を実行し、それによって必要な乱数を生成します。
同じ数の種子を持つランダムオブジェクト、同じ回数によって生成される乱数はまったく同じです。言い換えれば、同じ種子数を持つ2つのランダムオブジェクトの場合、初めて生成された乱数はまったく同じであり、2度目の乱数はまったく同じです。これには、複数の乱数を生成する際に特別な注意が必要です。
以下は、ランダムクラスの使用と、指定された間隔のランダム配列と実装プログラムで必要なチャンスを生成する方法について説明します。
1。ランダムオブジェクトの生成
ランダムクラスには2つのコンストラクターが含まれており、以下に順番に導入されています。
a。 public random()
この構造方法は、現在のシステム時間に対応する相対時間に関連する数値をシード番号として使用し、このシード番号を使用してランダムオブジェクトを構築します。
b。パブリックランダム(ロングシード)
このコンストラクターは、シード番号を策定することで作成できます。
サンプルコード:
コードコピーは次のとおりです。
ランダムr = new Random();
ランダムR1 =新しいランダム(10);
繰り返しますが、シードの数は、ランダムアルゴリズムの原点数にすぎず、生成された乱数の間隔とは何の関係もありません。
2。ランダムクラスの一般的な方法
ランダムクラスのメソッドは比較的単純であり、各方法の機能も理解しやすいです。ランダムクラスの各メソッドによって生成される乱数は均一に分布していることに注意する必要があります。つまり、間隔内の数値生成の確率は等しいことを意味します。これらの方法の基本的な紹介は次のとおりです。
a。 public boolean nextboolean()
この方法の機能は、ランダムなブール値を生成することであり、真と偽の値を生成する確率は等しく、つまり、両方とも50%です。
b。 public double nextdouble()
この方法の目的は、[0、1.0)の間の値でランダムな二重値を生成することです。
C、public int nextint()
この方法の目的は、-231から231-1の間のランダムなINT値を生成することです。
指定された間隔に対してINT値を生成する必要がある場合は、特定の数学的変換を実行する必要があります。詳細については、以下の使用例のコードを参照してください。
D、public int nextint(int n)
この方法の関数は、[0、n)の間隔内であるランダムINT値を生成することです。つまり、0とnの間のランダムな値を、nではなく含む。
指定された間隔のINT値を生成する場合は、特定の数学的変換も実行する必要があります。詳細については、以下の使用例のコードを参照してください。
e、パブリックボイドセットシード(長い種子)
この方法の目的は、ランダムオブジェクトのシードの数をリセットすることです。シードの数を設定した後、ランダムオブジェクトは、新しいキーワードで作成されたランダムオブジェクトと同じです。
3.ランダムクラスの使用例
ランダムクラスを使用すると、通常、指定された間隔に対して乱数を生成することです。以下では、対応する間隔の乱数を1つずつ生成する方法を紹介します。乱数を生成する次のコードは、次のランダムオブジェクトrを使用して生成されます。
ランダムr = new Random();
a。間隔[0、1.0)の小数を生成します
コードコピーは次のとおりです。
double d1 = r.nextdouble();
NextDoubleメソッドを使用して直接取得されます。
b。間隔の小数を生成[0,5.0)
コードコピーは次のとおりです。
double d2 = r.nextdouble() * 5;
NextDoubleメソッドによって生成される数間隔は[0、1.0)であるため、間隔を5回拡張することが必要な間隔です。
同様に、間隔[0、d)とdでランダムな小数を生成するには、陽性小数数の小数点以下であるため、NextDoubleメソッドの戻り値にdを掛ける必要があります。
c。間隔で小数を生成[1,2.5)
コードコピーは次のとおりです。
double d3 = r.nextdouble() * 1.5 + 1;
間隔[1、2.5)のランダムな小数を生成するには、最初に間隔のランダムな数を生成し[0、1.5)、次に生成された乱数間隔に1を追加する必要があります。
同様に、0(d1は0に等しくない)から始まらない10進数間隔[d1、d2)の範囲で乱数を生成するには、間隔[0、d2-d1)で最初に乱数を生成し、次に生成された乱数間隔をD1に追加する必要があります。
d。整数を生成します
コードコピーは次のとおりです。
int n1 = r.nextint();
NextIntメソッドを直接使用するだけです。
e。間隔で整数を生成[0,10)
コードコピーは次のとおりです。
int n2 = r.nextint(10);
n2 = math.abs(r.nextint()%10);
上記の2行のコードは、間隔[0,10]で整数を生成できます。
最初の実装は、ランダムクラスのnextint(int n)メソッドを使用して直接実装されます。
2番目の実装では、任意のint番号を生成するために、最初のnextint()メソッドを呼び出します。 10の数値で生成される間隔は(-10,10)で、間隔の絶対値を見つけ、得られた間隔は[0,10)です。
同様に、任意の間隔[0、n)でランダム整数を生成するには、次のコードを使用できます。
コードコピーは次のとおりです。
int n2 = r.nextint(n);
n2 = math.abs(r.nextint()%n);
f。間隔で整数を生成[0,10]
コードコピーは次のとおりです。
int n3 = r.nextint(11);
n3 = math.abs(r.nextint()%11);
整数間隔と比較して、[0,10]間隔と[0,11)間隔は同等であるため、[0,11]間隔の整数が生成されます。
g。間隔で整数を生成[-3,15)
コードコピーは次のとおりです。
int n4 = r.nextint(18)-3;
n4 = math.abs(r.nextint()%18)-3;
0から開始しないランダムな整数を生成するには、0から開始されない小数間隔の実装原理の上記の説明を参照できます。
H、達成するチャンス
特定のチャンスに応じてプログラムロジックを実装することは、ランダム処理によって解決できる問題でもあります。乱数を使用して偶然のロジックを実装する方法を示す簡単な例を以下に示します。
前の方法の紹介では、NextInt(int n)メソッドで生成された数値は均一です。つまり、間隔内の各数値の生成の可能性は同じです。その後、間隔[0,100]のランダム整数が生成された場合、各数値が生成される可能性は同じである必要があり、間隔に100の整数があるため、各数の可能性は1%です。この理論によれば、プログラムの確率問題を実現できます。
例:55%のチャンスで1を生成する整数、40%の確率で2、および3つのチャンスで3つの整数を生成します。実装されたコードは次のとおりです。
コードコピーは次のとおりです。
int n5 = r.nextint(100);
int m; //結果番号
if(n5 <55){// 55数の間隔、55%の確率
m = 1;
} else if(n5 <95){// [55,95)、40数の間隔、40%の確率
m = 2;
}それ以外{
m = 3;
}
各数の確率は1%であるため、55桁の間隔の確率は55%です。コードを書くことの利便性のために、[0,55]間隔のすべての整数がここで使用され、その後の原則は同じです。
もちろん、オッズは5%の倍数であるため、ここのコードを簡素化することができるため、5%に基づいてチャンスを制御するだけです。以下は、簡略化されたコードの実装です。
コードコピーは次のとおりです。
int n6 = r.nextint(20);
int m1;
if(n6 <11){
M1 = 1;
} else if(n6 <19){
M1 = 2;
}それ以外{
M1 = 3;
}
プログラム内では、上記の指示に従って確率のロジックを実装できます。
4。その他の問題
a。同じシード番号を持つランダムオブジェクトの問題
前述のように、同じ種子数のランダムオブジェクトは、同じ回数によって生成されるのと同じ乱数を持っています。以下はテストコードです。
コードコピーは次のとおりです。
ランダムR1 =新しいランダム(10);
ランダムR2 =新しいランダム(10);
for(int i = 0; i <2; i ++){
System.out.println(r1.nextint());
System.out.println(r2.nextint());
}
このコードでは、オブジェクトR1とR2で使用されるシードの数は10であるため、同じ回数によって生成される乱数はまったく同じです。
乱数が同じ状況を避けたい場合は、プロジェクトで生成する必要がある乱数の数に関係なく、1つのランダムオブジェクトのみを使用できることに注意する必要があります。
b。数学クラスのランダムメソッドについて
実際、数学クラスにはランダムな方法もあります。このランダムメソッドのジョブは、間隔[0、1.0)のランダム小数を生成することです。
数学クラスのソースコードを読むことで、数学クラスのランダムメソッドが、ランダムクラスのNextDoubleメソッドを直接呼び出すことにより実装されることがわかります。
ランダムな方法が比較的単純と呼ばれるというだけで、多くのプログラマーは数学クラスのランダムメソッドを使用して乱数を生成することに慣れています。