2017-02-18 3 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

Я предлагаю вам выполнить код в своем отладчике, чтобы увидеть, что именно делает каждая строка кода. –

+0

Вы спрашиваете, как работает 'array [random]'? –

ответ

0

Давайте рассмотрим этот код.

Начнем с создания экземпляра SecureRandom(). Согласно Javadocs, это позволит нам генерировать

криптографически сильных случайных чисел

означает, что они будут очень случайно. Читайте о pseudorandom number generators, если вы хотите знать, чего это избегает.

SecureRandom secureRandom = new SecureRandom(); 

Теперь мы создадим массив из семи Интс, первоначально установлен в 0.

Мы будем обрабатывать содержимое цикла for пять раз.

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

Начало цикла получает случайное число в диапазоне от 1 до 6 включительно, и присваивает его random.

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

Теперь мы увеличиваем массив в случайном положении. Обратите внимание, что позиция 0 никогда не обновляется, так как она не находится в диапазоне возможных значений для random.

В конце каждого цикла мы печатаем содержимое массива в std-out, что позволяет нам видеть, что цикл увеличивает каждый элемент. Вот почему вы видите пять отпечатков всего массива. Arrays.toString преобразует массив в разделенную запятыми версию, которую вы видите.

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

EDIT:

Из того, что я понимаю в ваших комментариях, вы хотели бы знать, почему значения в обновлении массива по 1 вместо стать случайным числом.

Массив представлен индексами следующим образом:

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

Когда доступ к массиву с array[random], мы используем random в качестве индекса. Он будет смотреть на значение случайного и сопоставить его с тем же номером в [ ] выше. Затем, так как вы говорите 1 + array[random], он только изменяет значение в этой позиции в массиве на 1.

EDIT x2: Если вы хотите другой выход, вам потребуется содержимое для петли быть:

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

Это установит значение (почти) случайное положение для случайной величины в пределах того же диапазона возможных индексов.

+0

Я хочу знать вместо этого [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, 1, 2] вывод почему это не дает мне этот выход [0, 0, 0, 0, 0, 5, 0] [0, 2, 0, 0, 0, 5, 0] [0, 2, 0, 0, 0, 5, 6] [0, 2, 0, 0, 0, 5, 6] [0, 2, 0, 0, 0, 5, 6] –

+0

если длина массива более 7, например 100, то что произойдет? это подсчет [int random = 1+ secureRandom.nextInt (6); ] случайная длина от 1 до 6 как длина массива? –

+0

Если вы сделаете длину массива более 7 без изменения генерации случайных чисел в исходном коде или моем EDIT x2, только числа из массива [1] через массив [6] (включительно) станут ненулевыми. Значение всех новых позиций останется равным нулю. –

0

Как видно из кода, значение случайных чисел не записывается в массив .. значение используется в качестве индекса. Если предположить, что первый массив обнуляется, то первая итерация будет писать 1 + 0 в случайный элемент массива (исключая 0 элемент). позже это может быть 1 + значение случайного элемента, которое на второй итерации будет 1 или 2, на 3-й - от 1 до 3 и т. д.

0

Это ключевая строка:

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

некоторый случайный элемент стал 1 + 0 первый раз. Когда мы случайно получим его второй раз - он стал 1 + 1, на третьем - 1 + 2 и т. Д.

0

Вы смешиваете содержимое массива с положением в массиве, позиция найдена случайным образом, а контент найден содержание случайной позиции +1. Если вы хотите иметь содержание от 0 до 6 внутри массивов следует использовать

array[random] = secureRandom.nextInt(6) 

вместо

array[random]=1+array[random]; 
Смежные вопросы