Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

27.2. Willekeurigheid - System.Random

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

27.2.1. Pseudo Willekeurig

Pseudo-willekeurige nummers uit een eindige reeks kunnen met gelijke probabiliteit gekozen worden, dit aan de hand van enkele instance members van de System.Random klasse.

De uitgekozen nummers zijn niet volledig willekeurig omdat er een gewoon een vastliggend wiskundig algoritme gebruikt wordt om die te selecteren, maar ze zijn wel willekeurig genoeg voor praktische doeleinden.
Visual Basic 2012 Broncode - Codevoorbeeld 684
Class Example1
    Public Shared Sub Main()
        Dim random1 As Random = New Random
        '
        ' random Integer value :
        Console.WriteLine(random1.Next())
        Console.WriteLine(random1.Next())
        '
        ' random Integer value (0 <= result < argument) :
        Console.WriteLine(random1.Next(5))
        Console.WriteLine(random1.Next(5))
        '
        ' random Integer value (argument1 <= result < argument2) :
        Console.WriteLine(random1.Next(0, 5))
        Console.WriteLine(random1.Next(0, 5))
        '
        ' random Double value (0.0 <= result < 1.0) :
        Console.WriteLine(random1.NextDouble())
        Console.WriteLine(random1.NextDouble())
        '
        ' random Byte values :
        Dim randomByteValues(9) As Byte
        random1.NextBytes(randomByteValues)
        For Each randomByte As Byte In randomByteValues
            Console.Write(randomByte & " ")
        Next
        Console.WriteLine()
        '
        TestProbability()
        '
        Console.ReadLine()
    End Sub
    Public Shared Sub TestProbability()
        Dim random1 As Random = New Random
        Dim probability(9) As Integer
        For count As Integer = 1 To 1000000
            probability(random1.Next(0, 10)) += 1
        Next
        For index As Integer = 0 To 9
            Console.WriteLine("random value : " & index & ", " & _
                              probability(index) & " times generated")
        Next
    End Sub
End Class
Mogelijke output zou zijn :
Console Application Output
201146790
1440898137
0
1
3
3
0,407168512887866
0,656177562967025
78 179 110 9 248 176 103 229 249 188
random value : 0, 100030 times generated
random value : 1, 99791 times generated
random value : 2, 99106 times generated
random value : 3, 100369 times generated
random value : 4, 99855 times generated
random value : 5, 100335 times generated
random value : 6, 100030 times generated
random value : 7, 99911 times generated
random value : 8, 100490 times generated
random value : 9, 100083 times generated

27.2.2. Seed

Het genereren van een eerste willekeurig getal gebeurt volgens een bepaald berekeningsalgoritme met een bepaalde startwaarde (ook wel "seed" genoemd).  De seed voor het bepalen van een volgend willekeurig getal is het vorige bepaalde willeurig getal.

De mogelijkheid bestaat zelf een initiele "seed" door te geven aan de constructor van Random.
Visual Basic 2012 Broncode - Codevoorbeeld 685
Class Example2
    Public Shared Sub Main()
        Dim seed As Integer = 5
        Dim random1 As Random = New Random(seed)
        Dim random2 As Random = New Random(seed)
        Console.WriteLine(random1.Next() = random2.Next())      ' True (1)
        Console.WriteLine(random1.Next() = random2.Next())      ' True (2)
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
True
True
Als verschillende Random objecten dezelfde seed gebruiken, zullen ze ook dezelfde "willekeurige" waardes genereren (zie (1) en (2)).

Indien men geen seed aan de constructor doorgeeft, wordt initieel gebruik gemaakt van een seedwaarde die gebaseerd wordt op het huidige tijdstip.
Visual Basic 2012 Broncode - Codevoorbeeld 686
Class Example3
    Public Shared Sub Main()
        Dim countTotal As Integer = 10000
        Dim count, countEqual As Integer
        For count = 1 To countTotal
            Dim random1 As Random = New Random()
            Dim random2 As Random = New Random()
            If random1.Next() = random2.Next Then countEqual += 1
        Next
        Console.WriteLine(countEqual & " times equal " & _
                          "( total times : " & countTotal & ")")
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
9998 times equal (total times : 10000)
Ook in bovenstaand voorbeeld is te zien hoe de twee Random objecten vaak dezelfde "willekeurige" waardes genereren.
Bij highperformance systemen kan het dus voorkomen dat als verschillende malen een object wordt gemaakt van het type Random en een willekeurig waarde wordt opgevraagd, dezelfde seed wordt gebruikt, en er dus verschillende malen dezelfde willekeurige waarde wordt gegenereerd, wat natuurlijk niet gewenst is.

De conclusie is dat indien men met verschillende Random objecten wenst te werken men er beter voor kan zorgen dat deze elke met een andere seed gaan werken.
Visual Basic 2012 Broncode - Codevoorbeeld 687
Class Example4
    Public Shared Sub Main()
        Dim countTotal As Integer = 10000
        Dim count, countEqual As Integer
        For count = 1 To countTotal
            Dim random1 As Random = New Random(count)
            Dim random2 As Random = New Random(count + 1)
            If random1.Next() = random2.Next Then countEqual += 1
        Next
        Console.WriteLine(countEqual & " times equal " & _
                  "( total times : " & countTotal & ")")
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
0 times equal (total times : 10000)
Het is natuurlijk nog altijd aan te raden hetzelfde Random object te herbruiken, om willekeurige waardes te genereren.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.