|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
26.2.1. Pseudo WillekeurigPseudo-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 2010 Broncode Class Example1 Public Shared Sub Main() Dim random1 As Random = New Random Console.WriteLine(random1.Next()) Console.WriteLine(random1.Next()) Console.WriteLine(random1.Next(5)) Console.WriteLine(random1.Next(5)) Console.WriteLine(random1.Next(0, 5)) Console.WriteLine(random1.Next(0, 5)) Console.WriteLine(random1.NextDouble()) Console.WriteLine(random1.NextDouble()) 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 boven
26.2.2. SeedHet 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 2010 Broncode 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()) Console.WriteLine(random1.Next() = random2.Next()) Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|