randomНачало работы со случайными


замечания

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

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

Фишер-Йейтс перетасовывает

Также известен как «Перетасовка Кнута» и «Дурстенфельд-Фишер-Йейтс». Эта тасовка принимает массив из 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++];
}
 

Установка или настройка

Подробные инструкции по произвольной настройке или установке.