Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.01.2012, 14:51

Unterschiedliche Zufallszahlen trotz gleichem Seed

Hallo!
Ich habe ein kleines Problem mit srand() und rand().
In meinem Programm hat der Benutzer die Möglichkeit, den Seed für srand() anzugeben.
Wenn er jetzt z.B. immer 2 eingibt, sollten immer die gleichen "Zufallszahlen" mit rand() generiert werden; was auch funktioniert.
Starte ich aber den PC neu, generiert mir srand(2) andere Zufallszahlen als vorher.
Ich hätte aber gerne, dass bei gleichem Seed jedes Mal die gleichen Zahlen mit rand() erzeugt werden.

Hier der betroffene Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
unsigned int seed = GetSeed();  // Fragt den Benutzer, welchen Seed er möchte.

srand(seed);

for (unsigned int rndNum, i = 0; i < numbersAmount; ++i)
{
    rndNum = rand() % (upperLimit - lowerLimit) + lowerLimit;  // upeerLimit und lowerLimit wurden vorher vom Benutzer festgelegt.
    m_randomNumbers.push_back(rndNum);  // m_randomNumbers ist eine private Membervariable; ein std::deque<unsigned int>
}


Wäre wirklich toll, wenn ihr mir helfen könntet :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Aremion« (22.01.2012, 14:58)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

22.01.2012, 15:12

Du willst aus immer der gleichen Zahl (also hier 2) immer die gleiche Zufallszahl? Muss man das jetzt verstehen?

Auf jeden Fall gibt es keine "zufälligen" Zahlen im PC. Die Funktion srand sucht einfach irgendeine Zahl aus dem RAM. Das heißt wenn du deinen PC neustartest (und der RAM geleert wird) wird danach natürlich eine andere Zahl generiert.

3

22.01.2012, 15:22

Die Sache ist die:
Die ermittelten Zahlen sortiere ich dann mit verschiedenen Sortieralgorithmen und stoppe die Zeit.
Jetzt wollte ich dem Benutzer ermöglichen, die Ergebnisse, die ich ermittle, nachzuvollziehen, indem ich ihm die Möglichkeit gebe, die selben Zufallszahlen zu generieren, wenn erwünscht.
Ich hoffe ihr versteht mich^^
Ich wusste nich, dass srand sich einfach irgendeine Zahl aus dem Arbeitsspeicher holt; ich dachte, sie verwendet einfach die übergebene, bei meinem Beispiel 2, und generiert dann daraus die Zahlen.
Gibt es eine Möglichkeit, auch nach einem PC-Neustart die gleichen Zahlen zu bekommen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

22.01.2012, 15:25

Sicher dass du srand(2) machst und nicht srand(1)? 1 ist die einzige Zahl bei der srand() spezielles Verhalten zeigt. Bei jedem anderen Seed muss garantiert die selbe Sequenz erzeugt werden.

Axilios

Frischling

Beiträge: 2

Beruf: Schüler

  • Private Nachricht senden

5

22.01.2012, 15:38

Ich dachte immer, dass der srand() Befehl immer Zufallszahlen generiert, mit Hilfe der Laufzeit des Computers.

6

22.01.2012, 15:46

@Axilios: Nur, wenn man die Zeit als Parameter für srand verwendet.

@dot, hab wirklich mit 1 getestet, sorry :pinch:

Habe jetzt nochmals mit 4 getestet, und es hat mir die gleichen Zahlen generiert.

Vielen Dank an alle; hoffentlich passiert mir nicht wieder so ein Fehler :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

22.01.2012, 15:56

Falls dein Compiler es schon anbietet, würde ich dir übigens (zumindest für die Zukunft) raten, statt rand() und srand() die neuen random number facilities der C++ Standardbibliothek zu nutzen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#include <random>


std::mt19937 my_generator(12345);  // Zufallszahlengenerator mit seed 12345

std::uniform_int_distribution<int> my_distribution(23, 42);  // Verteilung die einen int zwischen 23 und 42 liefert

int my_number = my_distribution(my_generator);  // Zufallszahl aus der Verteilung ziehen

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (22.01.2012, 16:04)


8

23.01.2012, 00:18

Und es ist wichtig zu wissen, was dir garantiert wird. Zufallszahlen sind ersteinmal nur Zufallszahlen, wenn du davon ausgehst, dass es immer die selben Pseudozufallszahlen sind, könnte es sein, dass das selbe Programm auf anderen Rechnern ganz andere Zahlen liefert. Was in welcher Form garantiert wird, weiß ich gerade auch nicht, aber es ist generell immer wichtig, ungefähr zu wissen, was im Hitnergrund passiert und worauf man sich wohl verlassen kann. Bei Zufallszahlen würde ich weder davon ausgehen, dass sie zufällig sind, noch dass sie deterministisch sind - es sei den du hast Quellen die definitiv gegenteiliges garantieren.
Stell dir vor, dein ganzes Projekt baut auf pseudozufälligen Levels auf, du wechselst den Compiler und alle Level sind komplett kaputt, wodurch das halbe Spiel nicht mehr funktioniert. Wenn du nur Schadenswerte berechnest, ist das dagegen relativ egal, da die Kämpfe im Mittel gleich ablaufen werden.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

23.01.2012, 01:47

Mit den Generatoren aus <random> wie in meinem Beispiel ist ganz genau definiert was für Algorithmen verwendet werden (MT19937 ist eine ganz bestimmte Variante des Mersenne Twister), der Code muss unter jedem Compiler auf jedem Recher zu jedem Zeitpunkt exakt das gleiche Ergebnis liefern. Bei rand() ist nur garantiert, dass srand() mit einem bestimmten Seed ungleich 1 immer wieder die selbe Sequenz erzeugt, aber nicht wie die genau auszusehen hat.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

23.01.2012, 08:18

Auf jeden Fall gibt es keine "zufälligen" Zahlen im PC. Die Funktion srand sucht einfach irgendeine Zahl aus dem RAM. Das heißt wenn du deinen PC neustartest (und der RAM geleert wird) wird danach natürlich eine andere Zahl generiert.

Absoluter Quatsch. Woher hast du das? Bevor du derart falsche Informationen verbreitest, informiere dich erst einmal darüber, wie ein Pseudozufallszahlengenerator wirklich funktioniert.

Werbeanzeige