Hoe willekeurige cijfers te genereren

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

De eerste stap, net als bij het gebruik van een API- klasse , is om het import-statement vóór het begin van uw programmacursus te zetten:

> importeer java.util.Random;

Maak vervolgens een willekeurig object:

> Willekeurige rand = nieuwe willekeurige ();

Het object Random biedt u een eenvoudige generator voor willekeurige getallen.

De methoden van het object geven de mogelijkheid om willekeurige getallen te kiezen. Met de methoden nextInt () en nextLong () wordt bijvoorbeeld een getal geretourneerd dat zich binnen het waardenbereik (negatief en positief) van respectievelijk de int en long-gegevenstypen bevindt:

> Willekeurige rand = nieuwe willekeurige (); for (int j = 0; j <5; j ++) {System.out.printf ("% 12d", rand.nextInt ()); System.out.print (rand.nextLong ()); System.out.println (); }

De geretourneerde nummers zijn willekeurig gekozen int en lange waarden:

> -1531072189 -1273932119090680678 1849305478 6088686658983485101 1043154343 6461973185931677018 1457591513 3914920476055359941 -1128970433 -7917790146686928828

Willekeurige nummers uit een bepaald bereik kiezen

Normaal gesproken moeten de te genereren willekeurige getallen van een bepaald bereik zijn (bijvoorbeeld tussen 1 en 40 inclusief). Voor dit doel kan de methode nextInt () ook een parameter int accepteren. Het geeft de bovengrens voor het bereik van nummers aan.

Het bovenste limietnummer is echter niet opgenomen als een van de nummers die kunnen worden gepickt. Dat klinkt misschien verwarrend, maar de methode nextInt () werkt vanaf nul naar boven. Bijvoorbeeld:

> Willekeurige rand = nieuwe willekeurige (); rand.nextInt (40);

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

Als u bijvoorbeeld een getal tussen 1 en 40 wilt kiezen, voegt u er een toe aan het resultaat:

> Willekeurige rand = nieuwe willekeurige (); int pickedNumber = rand.nextInt (40) + 1;

Als het bereik begint bij een hoger aantal dan moet u:

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

> Willekeurige rand = nieuwe willekeurige (); int pickedNumber = rand.nextInt (31) + 5;

Hoe willekeurig is de willekeurige klasse?

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

> importeer java.util.Random; openbare klasse RandomTest {; public static void main (String [] args) {Random rand = nieuw Willekeurig (20071969); voor (int j = 0; j

Ongeacht wie deze code uitvoert, de volgorde van de geproduceerde "willekeurige" nummers zal zijn:

> 3 0 3 0 7 9 8 2 2 5

Standaard het seednummer dat wordt gebruikt door:

> Willekeurige rand = nieuwe willekeurige ();

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 willekeurige nummergenerators die binnen dezelfde milliseconde zijn gemaakt dezelfde willekeurige nummers genereren.

Wees ook voorzichtig wanneer u de willekeurige klasse gebruikt voor elke toepassing die een veilige willekeurige nummergenerator moet hebben (bijv. Een gokprogramma). Het is mogelijk om het seednummer te raden op basis van de tijd dat de toepassing actief is. Over het algemeen is het voor toepassingen waarbij de willekeurige getallen absoluut kritiek zijn, het beste om een ​​alternatief voor het willekeurige object te vinden. Voor de meeste toepassingen waar er gewoon een bepaald willekeurig element moet zijn (bijv. Dobbelstenen voor een bordspel) werkt het prima.