Visual Basic/Random getallen
Inleiding random getallen
Soms heb je behoefte aan willekeurige (Engels: random) getallen. Visual Basic bevat een generator die willekeurige getallen kan genereren.
De functie Randomize initialiseert de generator voor willekeurige getallen.
De functie Rnd levert je vervolgens een willekeurig getal.
De klasse System.Random bevat extra mogelijkheden.
Randomize
De structuur van de functie Randomize is:
Randomize( [ getal ] )
De functie Randomize initialiseert de generator voor willekeurige getallen. Je kunt na Randomize een getal opnemen, dat wordt gebruikt om de generator te initialiseren. Als je geen getal opneemt, wordt de systeemtijd gebruikt om de generator te initialiseren, wat dan ook de aanbevolen manier is.
Voordat je het eerste willekeurige getal genereert, dien je de functie Randomize aan te roepen. Dit doe je als volgt:
Randomize()
of
Randomize(getal)
Als je de functie Randomize niet gebruikt, genereert Rnd telkens als je het programma start, dezelfde reeks van willekeurige getallen. Normaal gesproken is dit niet de bedoeling, maar soms wil je een programma testen door steeds dezelfde willekeurige getallen te genereren. En dan is het gebruik van Rnd zonder Randomize aan te raden.
Rnd
De structuur van de functie Rnd is:
Rnd [ (getal) ]
Het resultaat is van het type Single.
Als de generator geïnitialiseerd is, vraag je een volgend willekeurig getal op met de functie Rnd, die een Single retourneert:
Rnd
Het resultaat is een Single getal gelijk aan of groter dan 0, maar kleiner dan 1.
Je kunt ook een getal meegeven als argument, b.v.:
Rnd(getal)
Als getal kleiner dan 0 is, krijg je steeds hetzelfde getal Als getal 0 is, krijg je het getal dat het laatst gegenereerd is. Als getal groter dan 0 is of niet wordt meegegeven (zie eerste voorbeeld), wordt het volgende willekeurige getal in de reeks weergegeven.
Over het algemeen wordt Rnd gebruikt zonder argument.
Als je een willekeurig getal wilt genereren in het bereik ondergrens t/m bovengrens doe je dat met de volgende constructie:
Dim resultaat As Integer resultaat = CInt(Int(bovengrens - ondergrens + 1) * Rnd + ondergrens))
Stel je wilt een getal genereren dat minimaal 20 en maximaal 30 is, dan doe je dat als volgt:
resultaat = CInt(Int(11) * Rnd) + 20))
Uitleg: Rnd genereert een getal van 0 tot 1. Dit wordt vermenigvuldigd met 11, zodat het resulaat 0 tot 11 is. Het resultaat wordt afgekapt bij de komma, zodat het resultaat 0 t/m 10 is. Hierna wordt er 20 bij opgeteld, zodat het resultaat 20 t/m 30 is.
System.Random
De klasse System.Random kent wat meer mogelijkheden. Consequentie is dat we eerst een variabele van die klasse moeten declareren.
De initialisatie verloopt met de volgende aanroep:
Dim rnd1 As New Random()
Het object rnd1 is een pseudo random generator. In dit voorbeeld wordt voor de initialisatie weer de systeemtijd gebruikt.
Na de initialisatie krijg je het volgende willekeurige getal door de methode Next aan te roepen. Dit kan op de volgende manieren:
getal = rnd1.Next()
getal is een willkeurig geheel getal van 0 tot de maximale waarde van een integer.
getal = rnd1.Next(100)
getal is een willekeurig geheel getal van 0 t/m 99. Let op: de parameter in de aanroep is niet de bovengrens, maar 1 hoger dan de bovengrens!
getal = rnd1.Next(20, 30)
getal is een willekeurig geheel getal van 20 t/m 29. Let op: het tweede getal in de aanroep is dis niet de bovengrens, maar 1 hoger dan de bovengrens!
Als de eerste parameter groter is dan de tweede parameter treedt er een exceptie (foutmelding) op.
Je kunt een getal van 0 tot 1 (dus niet-gehele getallen) genereren met de volgende aanroep:
getal = rnd1.NextDouble()
Voorbeelden
Stel, je wilt een console-toepassing schrijven die tien keer gooit met twee dobbelstenen en het resultaat toont. Maak een console-toepassing en vul de code als volgt aan:
Module Module1 Sub Main() Dim rnd1 As New System.Random() For i = 1 to 10 Console.WriteLine(rnd1.Next(1, 7) & "- " & rnd1.Next(1, 7)) Next Console.ReadLine() End Sub End Module
Je krijgt nu tien regels met twee getallen te zien, bijvoorbeeld:
3- 2 2- 4 2- 3 4- 5 5- 4 1- 3 5- 2 1- 5 3- 4 6- 5