我不明白这些安全随机数如何转换为 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]
最佳答案
让我们单步执行这段代码。
我们首先创建 SecureRandom() 的实例。根据Javadocs ,这将让我们生成
cryptographically strong random numbers
这意味着它们将非常随机。了解 pseudorandom number generators如果您想知道这可以避免什么。
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(...);
这会将(几乎)随机位置的值设置为同一可能索引范围内的随机值。
关于java - 我无法理解以下代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42319462/