Entwickler-Ecke
Basistechnologien - Zufallszahlen sind nicht zufällig
_daff_ - Do 20.05.10 16:39
Titel: Zufallszahlen sind nicht zufällig
Hallo,
ich hab ein kleines Problem und komm einfach nicht drauf. Ich versuch mit dem unten angeführten Code ein
Array mit 4 zufälligen Werten zu erstellen. Leider bekomm ich immer nur 4 gleiche Werte zurück. Ich komm echt
nicht drauf warum -- vielleicht kann mir jemand einen tipp geben. Danke.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| using System; using System.Collections.Generic; using System.Text;
namespace RandomExample { class RandomValue { public Random randValue;
public RandomValue() { randValue = new Random(); }
public int getValue() { return randValue.Next(1, 10); }
} class Randomizer { public RandomValue[] myValue = new RandomValue[4];
public Randomizer() { myValue[0] = new RandomValue(); myValue[1] = new RandomValue(); myValue[2] = new RandomValue(); myValue[3] = new RandomValue();
Console.WriteLine("Random Values -------------------------------------"); Console.WriteLine("Random 1: " + Convert.ToString(myValue[0].getValue())); Console.WriteLine("Random 2: " + Convert.ToString(myValue[1].getValue())); Console.WriteLine("Random 3: " + Convert.ToString(myValue[2].getValue())); Console.WriteLine("Random 4: " + Convert.ToString(myValue[3].getValue())); } }
class Program { static void Main(string[] args) { Randomizer myRand = new Randomizer(); } } } |
Moderiert von
Christian S.: C#-Tags hinzugefügt
JasonDelife - Do 20.05.10 16:50
Du darfst nicht mehrere Random-Objekte erstellen, sondern nur eins.
Grüße, JasonDelife.
danielf - Do 20.05.10 16:53
Hallo und :welcome:,
das Problem ist, dass Random immer mit dem gleichen Wert initialisiert wird. Du legst in jeder Klasse ein neues Random-Objekt an (die sich deshalb untereinander nicht kennen). In der
MSDN-Doku [
http://msdn.microsoft.com/en-us/library/system.random.aspx] steht, dass wenn man den gleichen Seed-Wert verwenden man die gleiche Zahlenfolge bekommt.
D.h. du musst in deiner RandomValue-Klass bei der Erzeugung von Random einen
unterschiedlichen Seed mitgeben. Den Seed wiederum könntest du von einer anderen Random Klasse bekommen. Dies ist aber sehr umständlich und auch unnötig, den du kannst über die RandomValue auch ein Random Objekt sharen (mit static).
C#-Quelltext
1: 2: 3: 4:
| class RandomValue { static Random randValue; } |
Dein Konstrukt an sich ist aber eher ungeschickt (wahrscheinlich lernst du geraden). Den generell kannst du alle auch short machen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| class Program { static void Main(string[] args) { Random randomizer = new Random();
int[] zahlen = new zahlen[4];
foreach(var zahl in zahlen) { zahl = randomizer.GetValue(); } } |
Gruß
PS: Hier im Forum kannst du über Bereiche oder [ cs] und [/ cs] COde als solchen anzeigen.
_daff_ - Do 20.05.10 19:16
Hallo danielf,
Danke für deine rasche Lösung und die Hinweise. Mir war nicht bewusst, das bei der Initialisierung immer der
gleiche Seed Wert verwendet wird.
Gruß
_daff_ - Do 20.05.10 19:20
Hallo JasonDelife,
Danke für den Hinweis. Nach dem Durchlesen der Random-Class Doku, hätte ich vorher dem Posting machen sollen, war es klar.
Gruß
Kha - Do 20.05.10 19:52
_daff_ hat folgendes geschrieben : |
| Danke für deine rasche Lösung und die Hinweise. Mir war nicht bewusst, das bei der Initialisierung immer der gleiche Seed Wert verwendet wird. |
Grundsätzlich wird der Seed vom parameterlosen Konstruktor zeitabhängig initialisiert. Wenn aber zwischen der Erzeugung zweier Instanzen keine messbare Zeit vergeht... ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!