2013-09-30 10 views
5

Próbuję modelować ruch cen akcji w C++. Potrzebuję utworzyć losową liczbę z zakresu od 0 do 1.Tworzenie losowej liczby od 0 do 1 w trybie ciągłym

Wygląda jednak na to, że wartość generatora liczb losowych stale rośnie i nie jest przypadkowa.

Kod wygląda następująco:

#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"); 
} 

Nie wiesz, jak rozwiązać ten problem .. Potrzebujesz kilku wskazówek ...

+1

"Wartość generatora liczb losowych stale rośnie i nie jest przypadkowa." - nie! –

+0

tak. utworzone wartości to 0,812, 0,814 itd. Jak to naprawić? – lakesh

+2

@lakeh jeśli tak się stanie przy każdym ponownym uruchomieniu programu, wyjaśnieniem jest [tutaj] (http://stackoverflow.com/questions/17385541/c-predictable-rand-output/17385746#17385746). –

Odpowiedz

8

Potrzebujesz kilku wskazówek ...

prowadzenie 1:

poprawne porównania, należy użyć

double probability = (rand()/(double)(RAND_MAX + 1)); 
              ^
             for better scaling 

ponieważ aktualnie w kolejce if(probability <= (1/10)) porównujesz z 0 z powodu konwersji 1/101/3 i 2/3 do liczby całkowitej

prowadzenie 2:

przecież można użyć generatora z lepiej statistical properties

#include <random> 
#include <iostream> 

    std::random_device rd; 
    std::mt19937 gen(rd()); 
    std::uniform_real_distribution<> dis(0, 1); 
    double uniformOn01 = dis(gen); 
+0

Generator liczb losowych to ** nie ** problem. Problem polega na porównaniu prawdopodobieństw, których wartości mieszczą się w przedziale od 0 do 1 z frakcjami takimi jak '1/3'; wartości tych ułamków są zawsze 0. –

+1

Myślę, że powinieneś użyć 'rand()/((double) RAND_MAX + 1)' aby uniknąć problemu z przepełnieniem liczby całkowitej. – tidy

0

W wszystkich przypadkach, gdy porównamy prawdopodobieństwo masz podział liczby całkowitej, które wszystkie skutkują 0 ... zamiast (2/3) chcesz (2/(double)3) lub 2/3.0.

+2

To prawda, ale nie odpowiada na zadawane pytanie. xD –

+1

@ J.C.Leitão - um, tak, odpowiada na pytanie. Sposób w jaki napisany jest kod, ** ** zawsze zawsze ** zwiększa cenę akcji. –

+0

@PeteBecker Myślę, że pytanie jest związane z wartościami losowej liczby, a nie ceną akcji. –

1
if(probability <= (1/3)) 
    { 
    stockPrice = stockPrice -1; 
    } 
else 
    { 
    stockPrice = stockPrice +1; 
    } 

Od probabililty nigdy nie jest ujemny, to kod będzie prawie zawsze zwiększamy wartość stockPrice. Jedyny raz nie będzie, gdy probability będzie równy 0. To dlatego, że 1/3 jest podziałem integer, a jego wartość to 0. Zmień wszystkie te frakcje na coś podobnego do 1.0/3, a rzeczy będą znacznie lepsze. A to ma wartość nic wspólnego z jakością generatora liczb losowych. Niektórzy ludzie tak się ćwiczą, kiedy widzą, że nie widzą niczego innego.

Jednak jest tam jest błąd w skalowaniu w kodzie. Zamiast

double probability = (rand()/(double)RAND_MAX); 

użytku

double probability = (rand()/(double)(RAND_MAX + 1)); 

Jak oryginalnie napisany wartość probability będzie 1 ilekroć rand() wytwarza wartość RAND_MAX, i to znacznie częściej produkują inne wartości.

Powiązane problemy