erstellen Sie eine zufällige Zahl zwischen 0 bis 1 kontinuierlich
Ich versuche, das Modell eines Aktienkurses movement in C++. Ich brauche zum erstellen einer Zufallszahl zwischen 0 bis 1.
Aber es scheint, dass der random number generator, der Wert wird immer größer und ist nicht wirklich zufällig.
Der code sieht so aus:
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<time.h>
using namespace std;
int main()
{
double stockPrice = 25;
int start = 0, end = 0;
start = clock();
srand (time(NULL));
cout << (double) rand() / (double) (RAND_MAX) << endl;
system("pause");
while(stockPrice > 18)
{
if(stockPrice == 20)
{
double probability = (rand()/(double)RAND_MAX);
if(probability <= (1/10))
{
stockPrice = stockPrice-1;
}
else
{
stockPrice = stockPrice +1;
}
}
else if (stockPrice < 20)
{
double probability = (rand()/(double)RAND_MAX);
if(probability <= (1/3))
{
stockPrice = stockPrice -1;
}
else
{
stockPrice = stockPrice +1;
}
}
else
{
double probability = (rand()/(double)RAND_MAX);
if(probability <= (2/3))
{
stockPrice = stockPrice -1;
}
else
{
stockPrice = stockPrice +1;
}
}
cout << stockPrice << endl;
}
end = clock();
double t = (double)(start-end)/CLOCKS_PER_SEC;
cout << t << endl;
system("pause");
}
Nicht sicher, wie man dieses Problem lösen.. Müssen einige Hinweise...
- "der Zufallszahlengenerator Wert wird immer größer und ist nicht wirklich zufällig." - NÖ!
- ja. die Werte erstellt werden 0.812, 0.814 und so weiter.. Wie ich dieses Problem lösen?
- wenn das passiert auf jedem erneuten ausführen des Programms, here ist die Erklärung.
- Da das c++ - warum nutzen Sie nicht eine der modernen Zufallszahlengeneratoren zur Verfügung gestellt? random_device
- Haben Sie einen Blick auf die standard-Bibliothek uniform_real_distribution.
- könnten Sie noch mehr Infos rund um "die Werte geschaffen werden 0.812, 0.814 und so weiter"
- Wenn das nicht c++11, warum nicht verwenden die boost-Bibliotheken anstelle von rand(). Sie sollten eine viel bessere Verteilung der zahlen.
- besser unter was Messen?
- "besser" als in besser standhalten zu können (statistische) Untersuchungen, die im Vergleich zu den Eigenschaften eines "echten" Zufalls-generator finden Sie z.B. hier: en.wikipedia.org/wiki/Pseudorandom_number_generator
- jetzt sehe ich, vielen Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Führung 1:
richtigen Vergleiche, die Sie verwenden sollten
weil derzeit in der Zeile
if(probability <= (1/10))
Sie sind im Vergleich mit 0, da der Konvertierung1/10
1/3
und2/3
integerFührung 2:
nachdem alle Sie verwenden können-generator mit besser statistische Eigenschaften
1/3
; die Werte dieser Fraktionen sind immer 0.rand()/((double)RAND_MAX + 1)
zu vermeiden, integer-overflow-problem.Seit
probabililty
ist nie negativ, wird dieser code fast immer, erhöht sich der WertstockPrice
. Die einzige Zeit, die es nicht ist, wennprobability
0 ist. Das ist, weil1/3
ist integer division, und sein Wert 0 ist. Ändern Sie alle dieser Bruchteil um so etwas wie1.0/3
und die Dinge werden viel besser. Und das hat nichts zu tun mit der Qualität des Zufallszahlen-Generators. Manche Leute bekommen so ausgeübt werden, wenn Sie sehenrand
dass Sie nichts mehr sehen.Gibt es jedoch ist ein Fehler in der Skalierung in den code. Statt
verwenden
Als ursprünglich geschrieben, der Wert von
probability
1, wennrand()
erzeugt den WertRAND_MAX
, und es produziert andere Werte, die viel mehr Häufig.In allen Fällen, in denen Sie vergleichen die Wahrscheinlichkeit, Sie haben integer-division, das Ergebnis in 0... statt
(2/3)
Sie wollte(2/(double)3)
oder2/3.0
.rand
Leute, es ist keine Implementierung auf dem Planeten, der das tut, was die Frage beschreibt. Der code an sich falsch ist, und es wird sich stetig erhöhen den Aktienkurs. Wenn es noch Probleme danach behoben, es könnte geeignet sein, um sich die Qualität des Generators. Jedoch, für ein einfaches Programm wie dieses,rand
ist gut genug, und Probleme sind in den code selbst.