Array von Klassen
Ich habe ein problem mit meinem Programm ein wenig.
Ich eine Klasse angelegt, wie dies in meine Programme:
class ClassA
{
public int number = -1;
public Random rnd = new Random();
public void randomize()
{
var random = rnd;
number = rnd.next(4)+2;
}
}
Ich im Begriff war zu erstellen und array, die jedes array enthält eine Klasse,
die ich wie folgt erstellt. Ich übertragen das array an eine neue Methode, damit ich überprüfen kann.
public static void Main()
{
ClassA[,] arrayOfClass = new Class[6,6];
ClassA classA= new Class();
int i, j;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
classA.randomize();
arrayOfClass[i, j] = classA;
}
}
CheckClassA(arrayOfClass);
}
private void CheckClassA(ClassA[,] arrayOfClass)
{
int i,j;
for(i=0;i<6;i++)
{
for (j = 0; j < 6; j++)
{
Console.Writeline("Randoming : "+arrayOfClass[i,j].number);
{
}
}
Wenn ich diese, die nur für die Konsole produzieren die gleiche Anzahl über und über, aber anders auf jeden laufen, wie es nur randomize es einmal, dann nie, mischen Sie es erneut.
Meine Frage sind:
1. Warum mein Programm nur zufällig einmal, und wieder die gleiche Nummer auf allen den Wert des Arrays?
2. Funktioniert meine Methode der übertragung von array falsch?
Versuchte ich mit anderen Typ unten zu überprüfen, ob meine randomize gescheitert, aber Nein, es hat nicht wegen Ihrer Rückkehr die Zufallszahl als ich erwartet hatte.
public static void Main()
{
ClassA[,] arrayOfClass = new Class[6,6];
ClassA class= new Class();
int i, j;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
class.randomize();
arrayOfClass[i, j] = class;
Console.Writeline("Randoming : " + arrayOfClass[i,j].number);
}
}
}
Jede Anregung und Hilfe appriciated. Dank
InformationsquelleAutor Diom | 2013-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem verursacht wird, aufgrund der Tatsache, dass Sie nicht tatsächlich die Schaffung neuer
ClassA
Objekte, Sie sind nur mit den gleichen man zu jedem array-index. Sie schien auch falschClassA
an einigen stellen, wieClass
ich bin mir nicht sicher, wie Sie Sie zusammenstellen, wie es war. Bewegen Sie Ihre Klasse die Initialisierung in der Schleife, wo du bist Zuordnung zuarrayOfClass
.Wenn dies geschieht, führen Sie in ein weiteres Problem von allen der Rückgabe der gleichen Anzahl für einen ganz anderen Grund.
Es produziert die gleiche Anzahl, da jeder ClassA-in ein sehr enger Zeitraum und
Random
wird initialisiert mit dem gleichen seed.Dies ist aus der Random() default-Konstruktor-Seite auf MSDN:
Also im Grunde, weil
Random
ist pseudo-random-es ist initialisiert, indem eine Zahl, die basierend auf der Systemuhr. Ihre beste Weg, um dieses ist, dass dieselbenRandom
Objekt zwischen allen Instanzen desClassA
, entweder, indem Sie esstatic
oder durch die übergabe einer Instanz vonRandom
in derrandomize
Methode.Sollte dies das problem beheben (so dass es
static
):var random = rnd;
tut nichts und kann entfernt werden.so kann ich es löschen? Danke für die Anregung. Daniel, Diese Antwort hilft mir viel. und geben mir ein Verständnis von dem, was mein Fehler ist. Dank
InformationsquelleAutor Daniel Imms
Machen random-Objekt statisch ist, also jede Instanz der Klasse bezeichnet.
Dies ist, weil C# verwendet pseudo-random-Algorithmus, wo jedes nächste Wert ist irgendwie hing auf vorherigen Wert.
Für parameterlosen instanzierungen der Random-Klasse verwendet es aktuelle clock-Wert standardmäßig, so dass jede Instanz der Klasse erzeugt Random-Objekt mit dem gleichen Startwert und aufrufen von Next() liefert den gleichen Wert, als dieser Wert wird für ein weiteres Next () - und die Werte sind gleich.
InformationsquelleAutor Lev
Das eigentliche Problem Sie haben, ist, dass dein array ist immer das gleiche Objekt, für jeden Eintrag. Sie müssen
new
eine neue ClassA jedes mal, wenn Sie Durchlaufen, sonst bist du nur gehen zu zeigen, bis zum letzten .Anzahl.Natürlich, das ist neben dem kleinen wäre mit einer new Random() jedes mal", was Sie sollte machen statischen etwa so:
InformationsquelleAutor Rob G