2017-02-18 4 views
1

これらの安全な乱数が1に変換され、自動的に配列に並べ替える方法を理解していません。私はこれらの次のコードを理解できません

SecureRandom secureRandom = new SecureRandom(); 

int [] array = new int[7]; 

for(int i=0; i<5;i++) 
{ 
    int random = 1+ secureRandom.nextInt(6); 
    array[random]=1+array[random]; 
    System.out.println(Arrays.toString(array)); 
} 

出力:

[0, 0, 0, 0, 0, 1, 0] 
[0, 1, 0, 0, 0, 1, 0] 
[0, 1, 0, 0, 0, 1, 1] 
[0, 1, 0, 0, 0, 1, 2] 
[0, 2, 0, 0, 0, 1, 2] 
+0

を使用する必要があります配列内の0から6へのコンテンツを持っているしたい場合は、私はあなたの質問が何であるかを理解していませんよ。 –

+0

デバッガのコードをステップ実行して、各行のコードが何をしているかを正確に確認することをお勧めします。 –

+0

'array [random]'がどのように機能するのか尋ねていますか? –

答えて

0

このコードをステップアップしてみましょう。

まず、SecureRandom()のインスタンスを作成します。 Javadocsによると、これは、私たちは、彼らは非常にランダムであるという意味

暗号的に強い乱数

を発生させます。これが避けていることを知りたい場合は、pseudorandom number generatorsをお読みください。

SecureRandom secureRandom = new SecureRandom(); 

今、私たちは、最初は0に設定7つのintの配列を作成します。

int [] array = new int[7]; 

forループの内容を5回実行します。

for(int i=0; i<5;i++) 

ループの開始を含めて1と6の間の乱数を取得し、randomに割り当て。

int random = 1+ secureRandom.nextInt(6); 

ここで、ランダムな位置で配列をインクリメントします。 randomの可能な値の範囲内にないため、位置0が決して更新されないことに注目してください。

各ループの最後に、配列の内容をstd-outに出力します。これは、毎回ループのインクリメントを参照してください。これはまた、配列全体の5枚のプリントを見る理由です。 Arrays.toStringは、配列をコンマ区切りのバージョンに変換します。

System.out.println(Arrays.toString(array)); 

EDIT:

私はあなたのコメントに理解するものから、あなたは1で配列を更新中の値の代わりに、乱数になる理由を知りたいのです。次のように

アレイはインデックスにより表される:我々はarray[random]でアレイにアクセスするとき

array: { array[0], array[1], array[2], array[3], array[4], array[5], array[6] } 

、我々は、インデックスとしてrandom使用されています。それはrandomの値を見て、上記の[ ]の同じ番号と一致させます。次に、1 + array[random]と言うので、配列のその位置の値を1だけ変更します。

EDIT×2:

int random = 1 + secureRandom.nextInt(6); 
int anotherRandom = 1 + secureRandom.nextInt(6); 
array[random] = anotherRandom; 
System.out.print(...); 

これは、ランダムな値に(ほぼ)ランダムな位置の値を設定します:あなたが他の出力を望んでいた場合、あなたはするforループの内容が必要になります可能なインデックスの同じ範囲内にある。

+0

私はこの[0、0、0、0、0、1、0]の代わりに知りたいです [0,1,0,0,0,1,0] [0、1、0、0、0 、0,1,0,1,1] [0,1,0,0,0,1,2] [0、2、0、0、0、1、2]出力これは私にこの出力[0、 0,0,0,0,5,0] [0,2,0,0,5,0] [ 0、0、0、5、6] [0,2,0,0,0,5,6] –

+0

配列の長さが7以上の場合は100などとなります。それは数えています[int random = 1+ secureRandom.nextInt(6); ]配列の長さとしてランダムな長さ1〜6? –

+0

元のコードまたはEDIT x2コードの乱数生成を変更せずに配列の長さを7以上にすると、array [1]からarray [6](両端を含む)の数字だけが非ゼロになります。新しいポジションのすべてがゼロのままであることを意味します。 –

0

値を指標として用います。..乱数の値が配列に書き込まれていないことをコードから明らかです。最初の配列がゼロになっていると仮定すると、最初の反復はランダムな配列要素(0要素を除く)に1 + 0を書き込みます。後でそれはランダム要素の1 +値となります.2回目の反復で1〜2、3〜1〜3などとなります。

0

これは重要なラインです:

array[random]=1+array[random]; 

いくつかのランダムな要素が1 + 0は初めてとなりました。私たちが無作為に2回目になると、1 + 1、3 - 1 + 2などになります。

0

配列の配列と配列の内容を配列でミックスした場合、その位置はランダムであり、コンテンツはランダムな位置+1の内容。 あなたは

array[random] = secureRandom.nextInt(6) 

代わりの

array[random]=1+array[random]; 
関連する問題