randomAan de slag met willekeurig


Opmerkingen

Deze sectie geeft een overzicht van wat willekeurig is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook willekeurige grote onderwerpen vermelden en een link naar de gerelateerde onderwerpen bevatten. Aangezien de Documentatie voor random nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Fisher-Yates schuifelen

Ook bekend als de Knuth-shuffle en de Durstenfeld-Fisher-Yates-shuffle. Deze shuffle neemt een reeks van n elementen en schudt deze. Het algoritme is echt willekeurig in die zin dat na het schudden elke permutatie van de array even waarschijnlijk is.

In 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;
    }
}
 

Let op: het is noodzakelijk dat het vervangende element afkomstig is van [0, i] inclusief en niet [0, i) exclusief: anders zijn permutaties van de array waar elementen op hun plaats blijven onmogelijk, wat niet echt willekeurig is.

Ervan uitgaande dat willekeurige getallen O (1) nodig hebben om te genereren, werkt het algoritme op zijn plaats en neemt het O (n) tijd en ruimte in beslag. Een array die op deze manier wordt geschud, kan worden gebruikt om niet-herhalende elementen op te halen in O (1) geamortiseerde tijd per element.

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++];
}
 

Installatie of instellingen

Gedetailleerde instructies voor het willekeurig instellen of installeren.