主にJavaで乱数を取得する3つの方法を導入し、主にランダム()関数を使用してそれを実装します
方法1
(データ型)(最小値 + math.random()*(最大値-minimum値+1))例:
(int)(1+math.random()*(10-1+1))
1〜10のintタイプ
方法2
乱数を取得します
for(int i = 0; i <30; i ++){system.out.println((int)(1+math.random()*10));}(int)(1+math.random()*10) java.mathパッケージのランダムな方法は、1〜10のintランダム数を取得します
式は次のとおりです。最小値----最大値の乱数(積分)
(タイプ)min + math.random() *最大値
方法3
ランダムra = new Random();
java.utilパッケージのランダムクラスのnextintメソッドを使用して、1〜10のintランダム数を取得します
0から1の間のランダムな小数を生成します。
間隔[0、d)とdでランダムな小数を生成するには、陽性小数点以下であるため、NextDoubleメソッドの返品値にDを掛けるだけです。
[N1、N2]
それはra.nextdouble() *(n2-n1)+n1です
Javaで乱数を生成するいくつかの方法
1。J2SEでは、Math.random()メソッドを使用して乱数を生成できます。生成された乱数は0-1の間の2倍です。たとえば、特定の数字を掛けることができます。たとえば、100を掛けます。J2MEには存在しない100以内のランダムです。
2。java.utilパッケージでは、ランダムクラスが提供されます。新しいランダムオブジェクトを作成して、乱数を生成できます。ランダムな整数、ランダムフロート、ランダムダブル、ランダムロングを生成できます。これは、J2MEプログラムでよく使用する乱数を採取する方法でもあります。
3.システムクラスにはCurrentTimeMillis()メソッドがあります。この方法では、1970年1月1日の0:00:00から現在の方法にミリ秒数を返します。リターンタイプは長いです。乱数として使用できます。いくつかの数値を測定し、範囲に制限するために使用できます。
実際、ランダムのデフォルト構造方法では、上記の3番目の方法が乱数を生成するために使用されます。
方法2のランダムクラスには、次の説明があります。
java.util.randomクラスを構築するには2つの方法があります。
種はありません:
この方法は乱数を返し、結果は実行ごとに異なります。
public class randomtest {public static void main(string [] args){java.util.random r = new java.util.random();種で:
このように、プログラムが何回実行されても、返品結果は同じになります
public static void main(string [] args){java.util.random r = new java.util.random(10); for(int i = 0; i <10; i ++){system.out.println();}}}} 2つの方法の違いは次のとおりです
(1)最初に、Java Docを開いてください。ランダムクラスの説明が表示されます。
このクラスの例は、線形合同式を使用して変更できる48ビットシードを使用する擬似ランダム数ストリームを生成するために使用されます。
2つのランダムインスタンスが同じシードで作成されている場合、各インスタンスに同じメソッド呼び出しシーケンスが作成され、同じ数字のシーケンスを生成して返すことができます。この機能が実装されるようにするために、クラスランダムの特定のアルゴリズムを指定します。 Javaコードの完全な移植性のために、Javaの実装には、ここに示されているすべてのアルゴリズムをクラスランダムに使用する必要があります。しかし、ランダムクラスのサブクラスは、すべての方法の従来の契約に準拠している限り、他のアルゴリズムを使用することができます。
Java Docはランダムクラスを非常によく説明しており、私たちのテストでこれを検証しました。
(2)シード数が提供されていない場合、ランダムインスタンスのシードの数は、現在の時刻のミリ秒になります。 System.CurrentTimemillis()を介して、現在の時間のミリ秒を取得できます。 JDKのソースコードを開くと、これを非常に明確に見ることができます。
public random(){this(system.currenttimemillis()); }加えて:
nextint()の説明、nextint(int n)ランダムオブジェクトのメソッド:
int nextint()//次の擬似ランダム数を返します。これは、この乱数ジェネレーターのシーケンスに均等に分布したint値です。
int nextint(int n)//擬似ランダム数を返します。これは、この乱数ジェネレーターのシーケンスから取得した0(を含む)と指定された値(除外)の間に均等に分布するINT値です。
Java乱数の要約
乱数は、固定長の文字列または数を生成するなど、実際には広く使用されています。その後、多くの不確実な長さを生成するか、シミュレートされたランダム選択などを実行します。Javaは、開発者がこれをすべて達成するのに役立つ最も基本的なツールを提供します。
1. Java乱数を生成する方法
Javaには、乱数の3つの一般的な概念があります。
1。System.CurrentTimeMillis()を使用して、現在の時間に長いタイプのミリ秒数を取得します。
2。Math.random()を介して0と1の間の2倍の値を返します。
3.ランダムクラスを通じて乱数を生成します。これは、強力な機能を備えたプロのランダムツールクラスです。
2。ランダムAPI説明
1。JavaAPI説明
ランダムクラスのインスタンスは、擬似ランダム数ストリームを生成するために使用されます。このクラスは48ビットシードを使用し、線形合同式を使用してそれらを変更します(ドナルドクヌースのコンピュータープログラミングの芸術、第2巻、セクション3.2.1を参照)。
2つのランダムインスタンスが同じシードで作成されている場合、各インスタンスに同じメソッド呼び出しシーケンスが作成され、同じ数字のシーケンスを生成して返すことができます。属性の実装を確保するために、クラスランダムに特定のアルゴリズムが指定されています。
多くのアプリケーションでは、数学クラスのランダムな方法が使いやすくなります。
2。メソッドの概要
random()//新しい乱数ジェネレーターを作成します。
ランダム(長いシード)//単一の長いシードを使用して新しい乱数ジェネレーターを作成します。 }次の方法では、それを使用して乱数ジェネレーターの状態を保存します。
保護されたint next(int bits):次の擬似ランダム数を生成します。
boolean nextboolean():次の擬似ランダム数を返します。これは、この乱数ジェネレーターのシーケンスから取られた均等に分布したブール値です。
void nextbytes(byte [] bytes):ランダムなバイトを生成し、ユーザーが提供するバイト配列に配置します。
Double NextDouble():次の擬似ランダム数を返します。これは、この乱数ジェネレーターのシーケンスから取られた0.0〜1.0の間に均等に分布する二重値です。
float nextfloat():次の擬似ランダム数を返します。これは、この乱数ジェネレーターのシーケンスから採取した0.0〜1.0の間に均等に分布するフロート値です。
Double nextgaussian():次の擬似ランダム数を返します。これは、この乱数ジェネレーターのシーケンスから取られたガウス(「通常」)分布であり、平均値は0.0、標準偏差は1.0です。
int nextint():次の擬似ランダム数を返します。これは、この乱数ジェネレーターのシーケンスに均等に分布したint値です。
int nextint(int n):この乱数ジェネレーターのシーケンスから取られた均一に分布したint値である擬似ランダム数を返し、0(含む)と指定された値(除く)の間に均一に分布しています。
long nextlong():次の擬似ランダム数を返します。これは、この乱数ジェネレーターのシーケンスから取られた均一に分布した長い値です。
void setseed(長い種子):単一の長いシードを使用して、この乱数ジェネレーターの種子を設定します。
3.ランダムクラスの使用手順
1.種を摂取して、種を服用しないことの違い。ランダムクラスの基本的な使用は、ランダムの例を種子と種子のない例を分割することです。
素人の用語では、2つの違いは次のとおりです。種子が生成された場合、各実行によって生成された結果は同じです。
種子がない場合、生成するものは、実行するたびにランダムであり、パターンはまったくありません。
2.種子のないランダムオブジェクトを作成します
RANDOM RANDOM = new Random();
3.種子のないランダムオブジェクトを作成するには、次の2つの方法があります。
1)ランダムランダム= new Random(555L);
2)ランダム= new Random(); random.setseed(555L);
4。テスト
上記の使用法を説明するには、例を使用してください
java.util.randomをインポートします。 public class testrandomnum {public static void main(string [] args){randomtest(); testnoseed(); testSeed1(); testSeeD2(); } public static void randomtest(){ System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- long r1 = currenttimemillis(); System.out.println( "r2 =" + r3); System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Random(); for(int i = 0; i <3; i ++){system.out.println(random.nextint()); }} public static void testseed1(){ System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------実行結果:
- - - - - - - テスト() - - - - - - -
R1 = 1227108626582
R3 = 0.5324887850155043
R2 = -368083737
-------------- testnoseed()----------------------
809503475
1585541532
-645134204
------------- testseed1()----------------------
-1367481220
292886146
-1462441651
------------- testSeed2()----------------------
-1367481220
292886146
-1462441651
出口コード0で終了したプロセス
testSeeD1()およびtestSeeD2()メソッドの結果を通じて、2つの印刷結果が同じであるため同じであることがわかります。それらが再び実行された場合、結果はまだ同じです。これは、種子を持つ乱数の特徴です。種子がない場合、各実行の結果はランダムです。
V.包括的なアプリケーション
以下は、使用状況を示すための最近書かれた乱数ツールクラスです。
java.util.randomをインポートします。 public class randomutils {public static final string allchar = "0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; public static final string letterchar = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; public static final string numberChar = "0123456789"; public static string generatestring(int length){stringbuffer sb = new StringBuffer(); RANDOM RANDOM = new Random(); for(int i = 0; i <length; i ++){sb.append(allchar.charat(random.nextint(allchar.length())); } return sb.toString(); } public static string generatemixString(int length){stringbuffer sb = new StringBuffer(); RANDOM RANDOM = new Random(); for(int i = 0; i <length; i ++){sb.append(allchar.charat(random.nextint(letterchar.length())); } return sb.toString(); } public static string generateLowerstring(int length){return generatemixstring(length).tolowercase(); } public static string generateupperstring(int length){return generatemixstring(length).touppercase(); } public static string generatezerostring(int length){stringbuffer sb = new StringBuffer(); for(int i = 0; i <length; i ++){sb.append( '0'); } return sb.toString(); } public static string tofixdlengthstring(long num、int fixdlenth){stringbuffer sb = new StringBuffer(); string strnum = string.valueof(num); if(fixdlenth -strnum.length()> = 0){sb.append(generatezerostring(fixdlenth -strnum.length()); } else {throw new runtimeException( "convert number" + num + "例外は、長さの文字列に例外が作成されたときに発生します" + fixdlenth + ");} sb.append(strnum); return sb.tostring();} public static string tofixdlengtring(int fixdlenth = strnenth(intddlenth) string.valueof(num); } sb.append(strnum); return sb.tostring(); } public static void main(string [] args){system.out.println(generatestring(15)); system.out.println(generatemixstring(15)); System.out.println(generateLowerString(15)); system.out.println(generateupperstring(15)); system.out.println(generatezerostring(15)); System.out.println(tofixdlengthstring(123、15)); System.out.println(tofixdLengthString(123L、15)); System.out.println(tofixdLengthString(123L、15)); }}実行結果:
vwmbpinbzfgcphg
23hyrahdjkkpwmv
tigowetbwkm1nde
bpz1knejphb115n
0000000000000000
000000000000123
000000000000123
出口コード0で終了したプロセス
6。概要
1。乱数は非常に一般的に使用されています。 Javaでそれらを生成するには3つの方法があります。乱数は最も複雑です。
2。ランダムクラスオブジェクトは、種子を運ぶかどうかに違いがあります。種子が同じである限り、それらは複数回走り、乱数を生成した結果は常に同じです。
3.乱数でシードオブジェクトを作成するには、同じ効果を持つ2つの方法があります。しかし、種子の乱数はあまり役に立たないようです。
4。ランダムの関数は、math.random()の関数をカバーしています。
5.乱数を使用して、ランダム文字列などの複雑なランダムデータを実装できます。
6.繰り返さない乱数を研究しないでください、それはあまり意味がありません。
Javaでは、java.util.randomクラスを使用して乱数ジェネレーターを生成できます。ランダム()とランダム(長いシード)の2つの形式のコンストラクターがあります。 RANDAM()は、現在の時刻であるSystem.CurrentTimemillis()を使用し、発電機の種子として使用し、ランダム(長い種子)は、指定された種子を発電機の種子として使用します。
乱数ジェネレーター(ランダム)オブジェクトが生成された後、異なるタイプの乱数が異なる方法を呼び出して取得されます:nextint()、nextlong()、nextfloat()、nextdouble()など。
1>乱数を生成します
RANDOM RANDOM = new Random();ランダムランダム=新しいランダム(100); //シードの数を指定
乱数を取得するために、ランダムなメソッドを呼び出します。
2つのランダムオブジェクトが同じ種子(たとえば、両方が100)を使用し、同じ関数が同じ順序で呼び出された場合、それらの戻り値はまったく同じです。次のコードと同様に、2つのランダムオブジェクトの出力はまったく同じです
Java.util。*をインポートします。 class testrandom {public static void main(string [] args){random1 = new Random(100); system.out.println(random1.nextint()); system.out.println(random1.nextfloat()); system.out.println(random1.nextboolean());ランダムランダム2 = new Random(100); system.out.println(random2.nextint()); system.out.println(random2.nextfloat()); system.out.println(random2.nextboolean()); }} 2>指定された範囲の乱数
乱数は、モジュラス演算子%を使用して、特定の範囲内で制御されます
Java.util。*をインポートします。 class testrandom {public static void main(string [] args){random random = new Random(); for(int i = 0; i <10; i ++){system.out.println(math.abs(random.nextint())); }}}得られた乱数は正と負です。 Math.absを使用して、データ範囲を非陰性の数値として取得します。
3>指定された範囲内で非反復乱数を取得します
Java.util。*をインポートします。 class testrandom {public static void main(string [] args){int [] intret = new int [6]; intrd = 0; //ストレージ乱数int count = 0; //生成された乱数を記録int flag = 0; //フラグが生成されたかどうか(count <6){random rdm = new Random(System.CurrentTimemillis()); intrd = math.abs(rdm.nextint())2+1; for(int i = 0; i <count; i ++){if(intret [i] == intrd){flag = 1;壊す; } else {flag = 0; }} if(flag == 0){intret [count] = intrd; count ++; }} for(int t = 0; t <6; t ++){system.out.println(t+" - >"+intret [t]); }}} Javaの乱数を繰り返すことはできますか? Javaで生成された乱数を使用してデータベースのプライマリキーを生成できますか?この質問を念頭に置いて、一連のテストを行いました。
1。テスト1:パラメーターなしでランダム()コンストラクターを使用します
public class randomtest {public static void main(string [] args){java.util.random r = new java.util.random(); for(int i = 0; i <10; i ++){system.out.println(r.nextint()); }}}プログラムの実行結果:
-1761145445
-1070533012
216216989
-910884656
-1408725314
-1091802870
1681403823
-1099867456
347034376
-1277853157
プログラムをもう一度実行します:
-169416241
220377062
-1140589550
-1364404766
-1088116756
2134626361
-546049728
1132916742
-1522319721
1787867608
上記のテストから、パラメーターのないランダム()コンストラクターを使用して生成された乱数は繰り返されないことがわかります。それで、Javaはどのような状況で重複した乱数を生成しますか?以下のテストを見てみましょう。
2。テスト2:ランダムにシードの数を設定します
public class randomtest_repeat {public static void main(string [] args){java.util.random r = new java.util.random(10); for(int i = 0; i <10; i ++){system.out.println(r.nextint()); }}}プログラムが何回実行されても、結果は常に次のとおりです。
-1157793070
1913984760
1107254586
1773446580
254270492
-1408064384
1048475594
1581279777
-778209333
1532292428
さまざまなマシンでテストしても、テスト結果は変わりません!
3。原因分析:
(1)最初に、Java Docを開いてください。ランダムクラスの説明が表示されます。
このクラスの例は、線形合同式を使用して変更できる48ビットシードを使用する擬似ランダム数ストリームを生成するために使用されます(ドナルドクヌースのコンピュータープログラミングの芸術、第2巻、セクション3.2.1を参照)。
2つのランダムインスタンスが同じシードで作成されている場合、各インスタンスに同じメソッド呼び出しシーケンスが作成され、同じ数字のシーケンスを生成して返すことができます。この機能が実装されるようにするために、クラスランダムの特定のアルゴリズムを指定します。 Javaコードの完全な移植性のために、Javaの実装には、ここに示されているすべてのアルゴリズムをクラスランダムに使用する必要があります。しかし、ランダムクラスのサブクラスは、すべての方法の従来の契約に準拠している限り、他のアルゴリズムを使用することができます。
Java Docはランダムクラスを非常によく説明しており、私たちのテストでこれを検証しました。
(2)シード数が提供されていない場合、ランダムインスタンスのシードの数は、現在の時刻のミリ秒になります。 System.CurrentTimemillis()を介して、現在の時間のミリ秒を取得できます。 JDKのソースコードを開くと、これを非常に明確に見ることができます。
public random(){this(system.currenttimemillis()); } 4。結論:
上記のテストと分析を通じて、ランダムクラスをより深く理解します。同時に、Java Doc APIドキュメントを読むことで、Javaプログラミング機能を大幅に改善し、「真実を知る」ことを達成できると思います。困惑した問題に遭遇したら、「真実を知る」ことができるように、Javaソースコードを開くこともできます。
通常、Javaには2種類の乱数があり、1つは数学のランダム()メソッド、もう1つはランダムクラスです。
1。math.random()
0 <x <1の10進数が生成されます。
例:0から100までの数値の1つをランダムに書き、生成する方法は?
Math.random()は、10から1の小数のみを返します。50〜100が必要な場合は、最初に50回、つまり0から50の間にズームインします。これはまだ小数です。整数が必要な場合は、INTをキャストしてから、50〜50〜100を追加します。
最終コード:(int)(math.random()*50) + 50
2。ランダムクラス
ランダムランダム= new Random(); //デフォルトコンストラクターランダム= new Random(1000); //シード番号を指定する
ランダム化を実行する場合、ランダムアルゴリズムの起源の数はシードと呼ばれ、種子に基づいて特定の変換を実行し、それによって必要な乱数を生成します。
同じ数の種子を持つランダムオブジェクト、同じ回数によって生成される乱数はまったく同じです。言い換えれば、同じ種子数を持つ2つのランダムオブジェクトの場合、初めて生成された乱数はまったく同じであり、2度目の乱数はまったく同じです。
2。ランダムクラスの一般的な方法
ランダムクラスのメソッドは比較的単純であり、各方法の機能も理解しやすいです。ランダムクラスの各メソッドによって生成される乱数は均一に分布していることに注意する必要があります。つまり、間隔内の数値生成の確率は等しいことを意味します。これらの方法の基本的な紹介は次のとおりです。
A、パブリックブールネクストブール()
この方法の機能は、ランダムなブール値を生成することであり、真と偽の値を生成する確率は等しく、つまり、両方とも50%です。
B、パブリックダブルNextDouble()
この方法の目的は、ランダムダブル値を生成することです。値は[0、1.0)の間です。ここでは、括弧は間隔を含むエンドポイントを表し、ブラケットは間隔を含むエンドポイント、つまり0から1の間のランダムな小数、0を含むが1.0ではないことを表します。
C、public int nextint()
この方法の目的は、ランダムなINT値を生成することです。これは、-2の31stパワーと-1st電力2の31stパワーの間にあります。
指定された間隔に対して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)[1]の10進数[n1、n2]を生成します
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; //【、つまり、r.nextint() *(n2 -n1)+n1】n1は負の数n4 = math.abs(r.nextint()%18)-3;
0から開始しないランダムな整数を生成するには、0から開始されない小数間隔の実装原理の上記の説明を参照できます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。