Java SecureRandom внутреннее состояние - PullRequest
1 голос
/ 02 января 2012

Я пытаюсь перетасовать массив целых чисел, как показано ниже,

и http://en.wikipedia.org/wiki/Fisher-Yates_shuffle,

"Дополнительная проблема возникает, когда случайный случай Фишера-Йейтса используется с псевдослучайнымгенератор чисел или PRNG: поскольку последовательность чисел, выводимых таким генератором, полностью определяется его внутренним состоянием в начале последовательности, тасование, управляемое таким генератором, не может, возможно, привести к более четким перестановкам, чем генератор имеет различные возможные состояния.... "

  1. Достаточно ли этого, чтобы я заполнил мой генератор SecureRandom большим количеством байтов?
  2. Какой самый простой способ заполнить начальный массив байтов?т.е.

    байт [] seed = новый байт [2048];// заполнить начальный байт случайным образом, какой самый простой способ?SecureRandom secureRandom = новый SecureRandom (начальное число);

Код:

/**
 * http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
 * 
 * To shuffle an array a of n elements (indices 0..n-1):
 *      for i from n − 1 downto 1 do
 *          j ← random integer with 0 ≤ j ≤ i
 *          exchange a[j] and a[i]
 */
public int[] shuffle (int[] inSet ) {

    int [] returnSet = Arrays.copyOf(inSet, inSet.length);

    for( int i = inSet.length-1; i > 0; i-- ) {

        // j ← random integer with 0 ≤ j ≤ i
        int j = secureRandom.nextInt(i+1); 

        // swap returnSet[i] and returnSet[j]
        int temp = returnSet[i];
        returnSet[i] = returnSet[j];
        returnSet[j] = temp; 
    }
    return returnSet;
}

Ответы [ 2 ]

3 голосов
/ 02 января 2012

Вот хорошая статья: " Руководство программиста Java по случайным числам "

В основном, а) Вы не хотите использовать java.util.Random, поскольку он демонстрирует периодическое поведение (плохая случайность), б) SecureRandom - это значительное улучшение по сравнению с java.util.Random, но в зависимости от количества элементов, которые вы если вы хотите перемешать, предоставляемые им степени свободы могут быть слишком малы (см. в этом разделе ). Также другая проблема заключается в том, что SecureRandom довольно медленный. Если у вас есть проблемы с производительностью, вы можете перейти по ссылке выше для альтернативных PRNG, которые быстрее, чем SecureRandom.

0 голосов
/ 02 января 2012

Я думаю, что размер массива не так важен, как его содержимое. Одной из распространенных практик является создание семян в текущее время. Вы также можете попросить пользователя (если возможно) применить произвольный ввод с клавиатуры или мыши. Я заметил эту технику в менеджерах паролей.

Все зависит от ваших потребностей. Могу поспорить, что разумным способом было бы взять System.currentTimeMillis () (по желанию вы можете поиграть с ним, присоединившись к нему несколько раз или хэшировать его).

...