簡體   English   中英

我無法理解以下代碼

[英]i can't understand these following code

我不明白這些安全隨機數如何轉換為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]

從代碼中可以明顯看出,隨機數的值不會寫入數組。值被用作索引。 如果假設第一個數組為零,則第一次迭代會將1 + 0寫入隨機數組元素(不包括0個元素)。 之后它可能是隨機元素的1 +值,在第二次迭代時將是1或2,在第3次 - 從1到3等。

讓我們逐步完成這段代碼。

我們首先創建一個SecureRandom()實例。 Javadocs說 ,這將讓我們產生

密碼學上強大的隨機數

意思是他們會非常隨機。 如果您想知道這避免了什么,請閱讀偽隨機數生成器

SecureRandom secureRandom = new SecureRandom();

現在我們將創建一個包含七個整數的數組,最初設置為0

int [] array = new int[7];

我們將運行for循環的內容五次。

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

循環的開始獲得1到6之間的隨機數(包括1和6),並將其分配給random

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

我們現在在隨機位置遞增數組。 注意位置0永遠不會更新,因為它不在random的可能值范圍內。

在每個循環結束時,我們將數組的內容打印到std-out,讓我們看到每次循環增加一個元素。 這也是您看到整個陣列的五個打印件的原因。 Arrays.toString將數組轉換為您看到的逗號分隔版本。

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

編輯:

根據我在您的評論中的理解,您想知道為什么數組中的值更新為1而不是隨機數。

該數組由索引表示如下:

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

當我們使用array[random]訪問數組時,我們使用random作為索引。 它將查看random的值並將其與上面[ ]的相同數字匹配。 然后,既然你說1 + array[random] ,它只會將數組中該位置的值改為1

編輯x2:如果你想要其他輸出,你需要for循環的內容為:

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

這會將(幾乎)隨機位置的值設置為可能索引的相同范圍內的隨機值。

這是關鍵路線:

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

一些隨機元素第一次成為1 + 0。 當我們第二次隨機獲得它時 - 它變為1 + 1,第三次 - 1 + 2等。

將數組的內容與數組中的位置混合,通過隨機找到位置,並通過隨機位置+1的內容找到內容。 如果要在數組中包含0到6的內容,則應使用

array[random] = secureRandom.nextInt(6)

代替

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM