Ошибка шифрования / дешифрования в Ubuntu Caesar Cipher

Существует более эффективное и менее громоздкое решение для целых чисел, чем Collections.shuffle.

Проблема такая же, как последовательная выбор предметов из только не выбранных элементов в наборе и установка их в закажите где-нибудь еще. Это точно так же, как случайное обращение с картами или розыгрыш лотереи, выигранных из шляпы или бина.

Этот алгоритм работает для загрузки любого массива и достижения случайного порядка в конце загрузки. Он также работает для добавления в коллекцию List (или любой другой индексированной коллекции) и достижения случайной последовательности в коллекции в конце добавлений.

Это можно сделать с помощью одного массива, созданного один раз, или с помощью численного заказа, например списка. Для массива размер исходного массива должен быть точного размера, чтобы содержать все заданные значения. Если вы не знаете, сколько значений может произойти заблаговременно, использование набора с упорядоченным числом, например ArrayList или List, где размер не является неизменным, также будет работать. Он будет работать универсально для массива любого размера до Integer.MAX_VALUE, который составляет чуть более 2 000 000 000. Объекты списка будут иметь одинаковые пределы индекса. Когда вы дойдете до массива такого размера, на вашем компьютере может закончиться нехватка памяти. Может быть более эффективным загрузить массив, набранный для типов объектов, и преобразовать его в некоторую коллекцию после загрузки массива. Это особенно верно, если целевая коллекция не индексируется численно.

Этот алгоритм, точно так же, как написано, создаст очень ровное распределение, где дубликатов нет. Один из аспектов, который ОЧЕНЬ ВАЖНО, заключается в том, что он должен иметь возможность вхождения следующего элемента в текущий текущий размер + 1. Таким образом, для второго элемента можно было бы сохранить его в местоположении 0 или местоположении 1 . Для 20-го элемента можно сохранить его в любом месте, от 0 до 19. Как можно больше первый элемент останется в местоположении 0, так как он должен попасть в любое другое место. Это возможно, так как следующий новый пункт отправится куда угодно, включая следующее новое место.

Случайность последовательности будет такой же случайной, как случайность генератора случайных чисел.

Этот алгоритм также можно использовать для загрузки ссылочных типов в случайные местоположения в массиве. Поскольку это работает с массивом, он также может работать с коллекциями. Это означает, что вам не нужно создавать коллекцию, а затем перетасовывать ее или заказывать при любых заказах вставляемые объекты. Коллекция должна иметь возможность вставлять элемент в любом месте коллекции или добавлять его.

// RandomSequence.java
import java.util.Random;
public class RandomSequence {

    public static void main(String[] args) {
        // create an array of the size and type for which
        // you want a random sequence
        int[] randomSequence = new int[20];
        Random randomNumbers = new Random();

        for (int i = 0; i < randomSequence.length; i++ ) {
            if (i == 0) { // seed first entry in array with item 0
                randomSequence[i] = 0; 
            } else { // for all other items...
                // choose a random pointer to the segment of the
                // array already containing items
                int pointer = randomNumbers.nextInt(i + 1);
                randomSequence[i] = randomSequence[pointer]; 
                randomSequence[pointer] = i;
                // note that if pointer & i are equal
                // the new value will just go into location i and possibly stay there
                // this is VERY IMPORTANT to ensure the sequence is really random
                // and not biased
            } // end if...else
        } // end for
        for (int number: randomSequence) {
                System.out.printf("%2d ", number);
        } // end for
    } // end main
} // end class RandomSequence
0
задан 17 January 2019 в 17:05
поделиться