Zwei unterschiedliche zufallszahlen erzeugen.
-
zeig mal dein code
-
Dreadis schrieb:
Hallo ihr,
Ich habe ein Problem, und nach langem suchen nicht wirklich was gefunden. Ich muss zwei Zufallszahlen direkt hintereinander erzeugen. Das Problem ist das aktuell beide zahlen gleich sind. Auch sollen die zahlen nicht in Abhängigkeit stehen. Hat jemand eine Idee wie ich das am besten lösen kann?meine kristallkugel sagt mir, daß du
srand(time(0)); int x1=rand()%6+1; ... srand(time(0)); int x2=rand()%6+1;machst.
das ist falsch.richtig ist
int main() { srand(time(0));//nur einmal im prog, nämlich am anfang der main() ... ... int x1=rand()%6+1; ... int x2=rand()%6+1;jetzt sind die beiden zahlen quasi unabhängig von einander. sie können zufällig auch mal gleich sein.
willste sie auf ungleichheit zwingen, dann zum beispiel so:
int main() { srand(time(0));//nur einmal im prog, nämlich am anfang der main() ... ... int x1=rand()%6+1; ... int x2; do x2=rand()%6+1; while(x2==x1);
-
volkard schrieb:
int main() { srand(time(0));//nur einmal im prog, nämlich am anfang der main() ... ... int x1=rand()%6+1; ... int x2; do x2=rand()%6+1; while(x2==x1);mir wollte hier mal einer erzählen, dass das ganz schlimm ist, weil das theoretisch nie terminieren könnte.
-
hehe schrieb:
mir wollte hier mal einer erzählen, dass das ganz schlimm ist, weil das theoretisch nie terminieren könnte.
Nicht bei einem linearen Kongruenzgenerator wie dem
rand().
Wenn man allerdings plötzlich 1000 unterschiedliche Zufallszahlen zwischen 1 und 10000 haben will, sollte man sich ein effizienteres Verfahren überlegen, da der Rechenaufwand von oben genanntem sehr schnell ansteigt. Ein Ansatz wäre, alle Zahlen in einem Container zu speichern, diesen mit
std::random_shuffle()durchmischen und die gewünschte Anzahl Zufallszahlen am Anfang oder Ende auszulesen.
-
Nur mal so aus neugier...
Ich hasse die rand() funktion und man hat hier, wenn ich mich nicht irre, mir gerade eine alternative dazu geboten. wie soll das mit shuffle den Funktionieren ? Denn rand(); kann man knicken.
1. fängt immer mit selber zahl an und geht dann immer so weiter.
2. natürlicher upper bound = 36??? das ist banane
3. diese rand würde nur lohnen, wenn die anfangszahl immer unterschiedlich istmit shuffle ist das sicherlich genauso unzufällig, aber punkt 2 müsste damit doch auszuschalten sein. (bei rand geht das mit berechnungen auch, ist aber doof)
[code beispiel ?]dieser "kontainer", ist das einfeich eine variable, die man definieren kann ?
danke
-
Tim06TR schrieb:
Nur mal so aus neugier...
Ich hasse die rand() funktion und man hat hier, wenn ich mich nicht irre, mir gerade eine alternative dazu geboten. wie soll das mit shuffle den Funktionieren ? Denn rand(); kann man knicken.1. Wieso hasst du
rand()? Aus Prinzip, wegen Gerüchten, oder begründet?
2.std::random_shuffle()verwendet internrand(), es sei denn, du übergibst ein spezielles Prädikat.
3. Mehr Infos zu dieser Funktion unter http://www.cplusplus.com/reference/algorithm/random_shuffle/.Tim06TR schrieb:
1. fängt immer mit selber zahl an und geht dann immer so weiter.
Du hast aber von
srand()gelesen?Tim06TR schrieb:
2. natürlicher upper bound = 36??? das ist banane
Wie kommst du denn auf sowas?
Tim06TR schrieb:
3. diese rand würde nur lohnen, wenn die anfangszahl immer unterschiedlich ist
Überschneidet sich mit Punkt 1.
Tim06TR schrieb:
dieser "kontainer", ist das einfeich eine variable, die man definieren kann ?
Du musst noch viel lernen.

Container sind Sammlungen von mehreren Elementen gleichen Typs, also etwas Ähnliches wie Arrays.
-
http://www.cplusplus.com/reference/stl/
Hier hast du alle Container die C++ bietet.
Und hier eine beschreibung mit Beispiel zustd::random_shuffle()
http://www.cplusplus.com/reference/algorithm/random_shuffle/
-
Nexus schrieb:
Tim06TR schrieb:
2. natürlicher upper bound = 36??? das ist banane
Wie kommst du denn auf sowas?hab ich gelesen
Nexus schrieb:
Du musst noch viel lernen.

richtig ! ich bin dabei.
Nexus schrieb:
Du hast aber von srand() gelesen?
oookkkkaaaayyyy.
ähm das ändert natürlich einiges, darauf bin ich erst in diesem thread gestoßenNexus schrieb:
3. Mehr Infos zu dieser Funktion unter http://www.cplusplus.com/reference/algorithm/random_shuffle/.
ok das hilft sehr danke
-
Tim06TR schrieb:
hab ich gelesen
Wo denn?

Obere Grenze von
rand()sollteRAND_MAXentsprechen. Und das müsste grösser gleich 32767 sein.Tim06TR schrieb:
ok das hilft sehr danke
Ich würde mir www.cplusplus.com sowieso merken. Ich finde, diese Seite gibt einem eine sehr gute Übersicht über die Standardbibliothek. Wenn du etwas aus
stdnicht kennst, sollte das die erste Anlaufstelle sein.
-
Nexus schrieb:
Tim06TR schrieb:
hab ich gelesen
Wo denn?

Obere Grenze von
rand()sollteRAND_MAXentsprechen. Und das müsste grösser gleich 32767 sein.na, so ziemlich das was Tim06TR sagt.
-
volkard schrieb:
meine kristallkugel sagt mir, daß du
srand(time(0)); int x1=rand()%6+1; ... srand(time(0)); int x2=rand()%6+1;machst.
das ist falsch.richtig ist
int main() { srand(time(0));//nur einmal im prog, nämlich am anfang der main() ... ... int x1=rand()%6+1; ... int x2=rand()%6+1;Hallo volkard,
Danke für die Antwort. Leider lag deine Kristallkugel falsch.srand((unsigned) time(NULL)); Real timeFirstEnemy = rand() % 5; int Position = rand() % 5;Die Sache ist die, das die beiden zahlen auch gerne mal gleich sein dürfen nur bekomme ich bei dieser Funktion immer das gleiche Ergebnis.
Grüße
-
und was ist dein Real?
-
das ist vom Typ float. Könnte auch float da stehen.
-
Nexus schrieb:
Wenn man allerdings plötzlich 1000 unterschiedliche Zufallszahlen zwischen 1 und 10000 haben will, sollte man sich ein effizienteres Verfahren überlegen, da der Rechenaufwand von oben genanntem sehr schnell ansteigt. Ein Ansatz wäre, alle Zahlen in einem Container zu speichern, diesen mit
std::random_shuffle()durchmischen und die gewünschte Anzahl Zufallszahlen am Anfang oder Ende auszulesen.meinst du wirklich, ich bräuchte mit dem durchprobieren zehnmal so lang? glaub ich nicht. also ist random_shuffle doch langsamer.
-
Dreadis schrieb:
Hallo volkard,
Danke für die Antwort. Leider lag deine Kristallkugel falsch.war aber auch recht dicht dran.
wie ist es, wenn du srand((unsigned)time(NULL)) an den anfang der main() auslagerst?
-
volkard schrieb:
Nexus schrieb:
Wenn man allerdings plötzlich 1000 unterschiedliche Zufallszahlen zwischen 1 und 10000 haben will, sollte man sich ein effizienteres Verfahren überlegen, da der Rechenaufwand von oben genanntem sehr schnell ansteigt. Ein Ansatz wäre, alle Zahlen in einem Container zu speichern, diesen mit
std::random_shuffle()durchmischen und die gewünschte Anzahl Zufallszahlen am Anfang oder Ende auszulesen.meinst du wirklich, ich bräuchte mit dem durchprobieren zehnmal so lang? glaub ich nicht. also ist random_shuffle doch langsamer.
Kann man doch ausrechnen, wie groß die Wahrscheinlichkeit ist, dass man ne Zahl tirfft die man schon hat. Ist doch ne richtig interessante Aufgabe, die hier sicher einer ausrechnen will.