В этом разделе приведен обзор того, что такое случайный случай, и почему разработчик может захотеть его использовать.
Следует также упомянуть любые крупные предметы в случайном порядке и ссылки на связанные темы. Поскольку документация для случайного является новой, вам может потребоваться создать начальные версии этих связанных тем.
Также известен как «Перетасовка Кнута» и «Дурстенфельд-Фишер-Йейтс». Эта тасовка принимает массив из n
элементов и перемешивает их. Алгоритм поистине случайен в том, что после перетасовки каждая перестановка массива одинаково вероятна.
В java:
public static void shuffle(E[] deck) {
//From the end, swap each card with a random card from the unswapped portion.
for(int i = deck.length - 1; i > 0; i--)
{
//Pick an element from [0,i], inclusive.
int chosenCard = (int) (Math.random() * (i + 1));
E temp = deck[i];
deck[i] = deck[chosenCard];
deck[chosenCard] = temp;
}
}
Обратите внимание: необходимо, чтобы элемент замены включался из [0, i] включительно, а не [0, i) исключителен: в противном случае перестановки массива, где элементы остаются на месте, невозможны, что не является действительно случайным.
Предполагая, что предполагаемые случайные числа принимают O (1) для генерации, алгоритм работает на месте и принимает O (n) время и пространство. Массив, перетасованный таким образом, может использоваться для извлечения не повторяющихся элементов в O (1) амортизированном времени на элемент.
E[] deck;
int drawIndex;
//Elements are taken from an index that advances.
public E drawUniqueCard()
{
//Once all cards have been drawn, reshuffle the deck and draw from the top.
if(drawIndex == deck.length)
{
shuffle(deck);
drawIndex = 0;
}
//Pull the next card off the deck.
return deck[drawIndex++];
}
Подробные инструкции по произвольной настройке или установке.