Willekeurige getallen genereren in Java

Man met een bril, terwijl hij code schrijft op laptop en meerdere monitoren.

Sarinya Pinngam / EyeEm / Getty Images





Het genereren van een reeks van willekeurige nummers is een van die veelvoorkomende taken die van tijd tot tijd opduiken. In Java , kan dit eenvoudig worden bereikt door de klasse java.util.Random te gebruiken.

De eerste stap, zoals bij het gebruik van elke API klas , is om het importstatement voor het begin van je programmaklasse te plaatsen:



Maak vervolgens een willekeurig object:

Het object Random biedt u een eenvoudige generator voor willekeurige getallen. De methoden van het object geven de mogelijkheid om willekeurige getallen te kiezen. De methoden nextInt() en nextLong() retourneren bijvoorbeeld een getal dat binnen het waardenbereik (negatief en positief) van respectievelijk de gegevenstypen int en long ligt:



De geretourneerde getallen worden willekeurig gekozen int en long-waarden:

Willekeurige getallen uit een bepaald bereik kiezen

Normaal gesproken moeten de te genereren willekeurige getallen uit een bepaald bereik vallen (bijvoorbeeld tussen 1 en 40). Voor dit doel kan de methode nextInt() ook een parameter int accepteren. Het geeft de bovengrens aan voor het bereik van getallen. Het bovenlimietnummer is echter niet opgenomen als een van de nummers die kunnen worden gekozen. Dat klinkt misschien verwarrend, maar de methode nextInt() werkt vanaf nul. Bijvoorbeeld:

zal alleen een willekeurig getal kiezen van 0 tot en met 39. Om te kiezen uit een bereik dat begint met 1, voegt u eenvoudig 1 toe aan het resultaat van de nextInt()-methode. Als u bijvoorbeeld een getal tussen 1 en 40 wilt kiezen, voegt u er een toe aan het resultaat:

Als het bereik begint bij een hoger getal dan één, moet u:



  • minus het startnummer van het bovenste limietnummer en voeg er vervolgens een toe.
  • voeg het startnummer toe aan het resultaat van de methode nextInt().

Als u bijvoorbeeld een getal van 5 tot en met 35 wilt kiezen, is het bovenste limietnummer 35-5+1=31 en moet 5 aan het resultaat worden toegevoegd:

Hoe willekeurig is de willekeurige klasse?

Ik moet erop wijzen dat de klasse Random willekeurige getallen op een deterministische manier genereert. Het algoritme dat de willekeur produceert, is gebaseerd op een getal dat een zaad wordt genoemd. Als het seed-nummer bekend is, is het mogelijk om de nummers te achterhalen die uit het algoritme zullen worden geproduceerd. Om dit te bewijzen gebruik ik de cijfers van de datum dat Neil Armstrong stapte voor het eerst op de maan als mijn zaadnummer (20 juli 1969):​



Het maakt niet uit wie deze code uitvoert, de reeks geproduceerde 'willekeurige' getallen is:

Standaard het seed-nummer dat wordt gebruikt door:



is de huidige tijd in milliseconden sinds 1 januari 1970. Normaal gesproken levert dit voor de meeste doeleinden voldoende willekeurige getallen op. Houd er echter rekening mee dat twee generatoren voor willekeurige getallen die binnen dezelfde milliseconde zijn gemaakt, dezelfde willekeurige getallen zullen genereren.

Wees ook voorzichtig bij het gebruik van de Random-klasse voor elke toepassing die een veilige generator voor willekeurige getallen moet hebben (bijvoorbeeld een gokprogramma). Het is misschien mogelijk om het seed-nummer te raden op basis van de tijd dat de applicatie draait. Over het algemeen is het voor toepassingen waar de willekeurige getallen absoluut cruciaal zijn, het beste om een ​​alternatief te vinden voor het object Random. Voor de meeste toepassingen waar er gewoon een bepaald willekeurig element moet zijn (bijvoorbeeld dobbelstenen voor een bordspel), werkt het prima.