Random Klasse - Zufallszahl in einer Schleife immer gleich

30/07/2010 - 13:58 von beerhand | Report spam
Hallo,

nach x Jahren Abwesenheit von der Programmierung habe ich mich
entschlossen mit C# anzufangen. Habe mir das Buch C# von kopf bis Fuss
zugelegt und komme soweit gut voran. Im Rahmen eines Buch-Workshops
soll ich nun ein Programm entwickeln, dass ein Hunderennen simuliert.
Nun stosse ich auf ein Problem mit der Random Klasse.

HIer kurz die Aufgabenstellung reduziert auf mein Problem:

Habe vier "Hunde Objekte" als PictureBox (2-5) die sich in einer
Schleife per Random auf dem Bildschirm bewegen sollen, bis einer als
erster das Ziel erreicht hat.

Hier die Klasse Windhund reduziert auf die benoetigten Objekte :

Public class Windhund
{
public PictureBox Bild = null;
public Random Zufall;

public void Laufen()
{
point p = Bild.Location; //aktuelle Position der PictureBox
p.X += Zufall.Next(0,5); //soll zwischen 0 und 5 Schritte nach
Rechts verschoben werden
//und hier ist das Problem:
Lasse ich dies Laufen, ist scheinbar
//waehrend jeder Schleife,
die Radomzahl identisch. D.h., alle 4
//PictureBoxen gehen
identisch weiter nach rechts. Habe auch
//Zufall.Next(5) ausprobiert
- hat auch nicht funktioniert.
Bild.Location = p; //PictureBox bewegt sich an die neue
Position.
}
}

//Hier die in der Form definierte Objekte:

namespace UebungKap4_S166
{
public partial class Form1 : Form
{
Windhund hund1;
Windhund hund2;
Windhund hund3;
Windhund hund4;

public Form1()
{
InitializeComponent();
hund1 = new Windhund()
{ Bild = pictureBox2, Zufall = new Random() };
hund2 = new Windhund()
{Bild = pictureBox3, Zufall = new Random() };
hund3 = new Windhund()
{Bild = pictureBox4, Zufall = new Random()};
hund4 = new Windhund()
{Bild = pictureBox5, Zufall = new Random() };
}

//Beim Druecken diese Buttons sollen die Hunde (PictureBox)
bewegt werden.

private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 250; i++) // Habe hier eine Schleife
zum Testen eingerichtet.
{
hund1.Laufen(); // Siehe Methode Laufen - die dort
generierte Zufallszahl scheint pro Schleife
hund2.Laufen(); // bei allen vier Windhund Instanzen
gleich zu sein.
hund3.Laufen(); // z.B. Waehrend Schleife i ist
Zufall.Next(5) fuer alle 4 Hundx.Laufen()
hund4.Laufen(); // gleich. Naechste Schelife i+1
aendert sich die Zufallszahl bleibt aber
// innerhalb der 4
hundx.Laufen() Aufrufe gleich
}
}

Habe, dass ganze anders programmiert und in der Methode Laufen() eine
eigene Zufallszahl generiert. Dann scheint es zu klappen und die
Pictureboxen bewegen sich erwartungsgemaess unterschiedlich nach
rechts. Aber eigentlich sollte das doch auch so funktionieren.

Jemand eine Idee was ich falsch mache?

Gruss
Mike
 

Lesen sie die antworten

#1 Hilmar Bunjes
30/07/2010 - 14:13 | Warnen spam
Am 30.07.2010 13:58, schrieb beerhand:

nach x Jahren Abwesenheit von der Programmierung habe ich mich
entschlossen mit C# anzufangen. Habe mir das Buch C# von kopf bis Fuss
zugelegt und komme soweit gut voran. Im Rahmen eines Buch-Workshops
soll ich nun ein Programm entwickeln, dass ein Hunderennen simuliert.
Nun stosse ich auf ein Problem mit der Random Klasse.

HIer kurz die Aufgabenstellung reduziert auf mein Problem:
[...]

Habe, dass ganze anders programmiert und in der Methode Laufen() eine
eigene Zufallszahl generiert. Dann scheint es zu klappen und die
Pictureboxen bewegen sich erwartungsgemaess unterschiedlich nach
rechts. Aber eigentlich sollte das doch auch so funktionieren.

Jemand eine Idee was ich falsch mache?



Wenn du den Random-Konstruktor ohne Initialwert nimmst, also "new
Random()" wird ein zeitabhàngiger Initialwert genommen, der scheinbar
bei allen vier Hunden gleich ist (die Aufrufe finden recht schnell
hintereinander statt).

Eine mögliche Umgehung des Problems ist, nur ein Random Objekt zu
erzeugen und den anderen die Referenzen auf das Objekt statt einem neuen
Objekt zu geben.

Gruß,
Hilmar

Ähnliche fragen