java - 我无法理解以下代码

标签 java arrays

我不明白这些安全随机数如何转换为 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/

相关文章:

Java 查找最大元素

java - 为什么 Java 说我的变量没有初始化?

Java 8 格式化日期输入

c - 打印二维数组的内容(指针的指针)

php - 将 postman 多级数组插入数据库

java - REGEX 努力但没有结果

java - 在Android Java中,类名放在括号中是什么意思?

php - 如何从数组中删除换行之后的单词?

c - 尝试声明字符串数组时出现 C 中的段错误。

c - 如何将字符串转换为int并将结果放入数组