Die Erzeugung eines random-Doppel zwischen einer Reihe von Werten
Im Moment Probleme beim generieren von zufälligen zahlen zwischen -32.768 und 32.768 sein. Es gibt mir immer die gleichen Werte, aber mit einer kleinen änderung in der decimal-Feld. ex : 27.xxx.
Heres mein code, jede mögliche Hilfe würde geschätzt.
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
srand( time(NULL) );
double r = (68.556*rand()/RAND_MAX - 32.768);
cout << r << endl;
return 0;
}
Haben Sie versucht, mit einer Schleife. Da die Zeit(NULL) ändert sich nicht, viel von einer Sekunde auf die nächste, die Chancen sind, dass Sie die gleiche Anzahl jedes mal. gettimeofday()'s Mikrosekunde zählen kann auch besser arbeiten.
Vorbei an aufeinander folgenden Werten zu
Vorbei an aufeinander folgenden Werten zu
srand
sollte und in der Regel nicht in der Nähe ergibt sich auch aus den ersten Aufruf rand
. (Obwohl, da gibt es keine tatsächlichen Anforderungen an die Qualität der rand
ich denke, YMMV.)
InformationsquelleAutor Olivier | 2013-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte ich erwähnen, wenn Sie eine C++11-compiler verwenden, können Sie etwas wie dieses, die ist tatsächlich einfacher zu Lesen und schwerer zu versauen:
Als bames53 darauf hingewiesen, dass der obige code kann noch kürzer, wenn Sie den vollen nutzen von c++11:
Antwort aktualisiert.
Vereinbart. Vielen Dank für die Hinweise. Antwort aktualisiert 🙂
Np, trotzdem sollte man auch den Namen ändern, der
normal_dist
da, dass sollte nur verwendet werden, mitstd::normal_distribution
oder ähnliches. (normal-Verteilungen werden auch als Gauß.)Lol. Kann nicht glauben, dass ich verpasst. Wieder aktualisiert 🙂
InformationsquelleAutor Carl
So, ich denke, dies ist ein typischer Fall von "mit Zeit(NULL) ist kein guter Weg, der seeding Zufallszahlen für die Läufe beginnen in der Nähe zusammen". Gibt es nicht so viele bits, dass der Wandel in
time(NULL)
von einem Anruf zum nächsten, so zufällige zahlen sind ziemlich ähnlich. Dies ist keine neue Phänomene, die - wenn Sie google "meine random-zahlen sind nicht sehr zufällig", Sie finden VIELE diese.Es gibt ein paar verschiedene Lösungen - ein Mikrosekunden oder Nanosekunden-Zeit, wäre die einfachste Wahl - bei Linux
gettimeofday
wird Ihnen eine Mikrosekunde Zeit als Teil der Struktur ist.InformationsquelleAutor Mats Petersson
Es scheint, werden klar ersichtlich, aber einige der Beispiele, die etwas anderes sagen... aber ich dachte, wenn Sie aufteilen 1 int mit einem anderen bekommen Sie immer ein int? und Sie brauchen, um Typ-cast jedes int in double/float, bevor Sie Sie trennen.
ie: double r = (68.556* (double)rand()/(double)RAND_MAX - 32.768);
auch wenn Sie call srand() bei jedem Aufruf von rand () " setzen Sie das Saatgut, die Ergebnisse in ähnliche Werte jedes mal statt "random".
68.556*rand()/RAND_MAX
ist wie:(68.556*rand())/RAND_MAX
, was bedeutet, dass der Zähler ist eindouble
.ah, von Links nach rechts, sehe ich. Ich würde noch setzen Sie es um zu vermeiden, unvorhergesehene Probleme, wenn ich später den code ändern.
InformationsquelleAutor Sellorio
Ich habe ein
for
- Schleife, um dein Programm:Beispiel-Ausgabe:
Scheint es Okay für mich. Ich habe den code auf Ideone für Sie.
Hier sind vier Läufen:
Vielleicht sind Sie nicht, warten Sie mindestens eine Sekunde zwischen den runs?
Macht meine Beispiel-Ausgabe des oben Aussehen wie die Ausgabe auf
ideone
? Ich lief es wieder und bekam, "30.3961 -13.9189 14.837 25.0323 -7.88294 24.9879 3.77392 18.4251 -8.11763 35.4337" dann "25.0197 31.0387 -10.2659 -8.66796 -28.1792 -6.34876 7.51343 -32.6934 -23.4206 -16.8222". Ich bin mir nicht sicher, was du falsch machst (es sei denn, Sie warten, weniger als eine Sekunde zwischen den Läufen), aber das Problem ist nicht in Ihrem code.Ja ich habe kopiert den code von ideone. Das einzige problem das ich habe ist, dass der erste Wert in der Schleife ist immer die gleiche (kleine änderung in dezimal). Der rest ist random.
Klingt wie dein PRNG ist sehr niedrige Qualität. Versuchen Sie, eine extra
rand()
rufen Sie an den Anfang Ihres Programms. (Aber, ehrlich gesagt, wenn Sie irgendwelche Anforderungen haben alle, nicht verwendenrand()
. Es hat keine Qualität garantiert.)yep ! es funktioniert aus irgendeinem Grund. In meinem main-Programm, das ich nutzlos rand() floating damit alles funktioniert, irgendwie komisch. Vielen Dank !
InformationsquelleAutor David Schwartz