2016-12-12 2 views
-3

C++ Randomize andere Variablen eines Konstruktors

Robot::Robot()

fitness = 5; totalBattery = 5; int randNum; int i = 0; bool valid = true; srand(time(NULL)); //get robot's position on board and check to see if it is not starting on the wall while (valid) { position = (rand()+i++) % 196; if (position >= 0 && position <= 14) { } else if ((position % 14) == 0 || (position % 14) == 13) { } else if (position >= 183 && position <= 195) { } else { valid = false; cout << endl << "MY POSITION IS : " << position << endl << endl; } } //randomize Robot Genetics for (int j = 0; j < genes; j++) { for (int k = 0; k < chromosomes; k++) { //first 4; set N S E W(what the robot looks for in that direction) //0 = empty; 1 = battery; 2 = don't care; 3 = wall if (k < 4) { randNum = ((rand()+i++) % 4); switch(randNum) { //Empty Space case 0: DNA[j][k] = " * "; break; //Battery case 1: DNA[j][k] = " B "; break; //Don't Care case 2: DNA[j][k] = " D "; break; //Wall case 3: DNA[j][k] = " W "; break; default: cout << "YOUR CODE SCREWED UP IF YOU ARE IN HERE!! " << endl; } } //direction facing; N S E W else if (k < 5) { randNum = ((rand()+i++) % 4); switch(randNum) { case 0: DNA[j][k] = "N"; break; case 1: DNA[j][k] = "S"; break; case 2: DNA[j][k] = "E"; break; case 3: DNA[j][k] = "W"; break; default: cout << "YOUR CODE SCREWED UP IF YOU ARE IN HERE!! " << endl; break; } } //step counter in that direction else if (k < 6) { DNA[j][k] = "0"; } //Rotate Right(R); Rotate Left(L); Move in facing Direction(M); Do Nothing (X) else { randNum = ((rand()+i++) % 4); switch(randNum) { case 0: DNA[j][k] = "X"; break; case 1: DNA[j][k] = "L"; break; case 2: DNA[j][k] = "R"; break; case 3: DNA[j][k] = "M"; break; default: cout << "YOUR CODE SCREWED UP IF YOU ARE IN HERE!! " << endl; break; } } } }

}

Ich versuche, Objekte einer Klasse zu bauen, und ich brauche 200 von ihnen. Ich verwende einen Vektor und wiederhole eine while-Schleife und jedes Mal, wenn ich eine neue Instanz der Klasse konstruiere, kommen die Objekte mit genau denselben Daten heraus. Wie soll man die Randomizer-Funktion verwenden, um beim Konstruieren von Objekten einer Klasse unterschiedliche Daten in Variablen zu bekommen? Ich habe versucht, Nachforschungen anzustellen, aber das hat mich zu diesem Punkt gebracht und ich bin mir nicht sicher, warum das nicht funktioniert. Danke im Voraus.

+0

Das Hinzufügen eines Standardfalls für etwas Unmögliches ist wirklich lächerlich. Wenn du irgendwie einen Wert von mod 4 als> 3 bekommst, ist dein Computer kaputt. Es ist kein Code-Problem. – tadman

+1

@tadman: Es ist üblich, sich vor zukünftigen Änderungen im Code zu schützen, die unbeabsichtigte Konsequenzen haben könnten. Und außerdem, während der Ausdruck "n% 4" (unter Annahme von eingebauten Typen hier) keinen Wert größer als 3 erzeugen kann, kann er sicherlich einen Wert kleiner als 0 erzeugen. –

+0

@BenjaminLindley Es ist die schlechteste Form der defensiven Programmierung. Wenn das wirklich schlimm ist, 'abort()'. – tadman

Antwort

0

Höchstwahrscheinlich produzieren Sie Objekte zu schnell. Wenn die Methode time() bei jedem Aufruf des Konstruktors den gleichen Wert liefert, ergeben sich die gleichen "zufälligen" Werte.

Wenn Sie srand nur einmal beim Programmstart rand() aufgerufen haben, ergeben sich für jedes Objekt unterschiedliche Werte.

+0

Ich nahm an, wenn ich einen i-Wert iterierte, indem ich ihn um 1 erhöhte, dass jedes Mal, wenn er randomisiert wurde, der Wert nicht derselbe sein konnte. Schlägst du vor, dass ich srand außerhalb des Konstruktors setze? – Rwal27

+0

@ Rwal27 _ "Schlägst du vor, dass ich srand außerhalb des Konstruktors lege?" _ Wie in der Duplikatsantwort erwähnt, solltest du 'srand()' nur einmal aufrufen, wenn du dein Programm ausführst. –