[英]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.