2013-09-30 14 views
5

के बीच एक यादृच्छिक संख्या बनाने के लिए मैं सी ++ में स्टॉक मूल्य आंदोलन मॉडल करने की कोशिश कर रहा हूं। मुझे 0 से 1.0 से 1 लगातार

के बीच यादृच्छिक संख्या बनाने की आवश्यकता है, लेकिन ऐसा लगता है कि यादृच्छिक संख्या जेनरेटर मान बढ़ता रहता है और वास्तव में यादृच्छिक नहीं है।

कोड इस तरह दिखता है:

#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"); 
} 
नहीं

यकीन है कि यह कैसे हल करने के लिए .. कुछ मार्गदर्शन ...

+1

"यादृच्छिक संख्या जनरेटर मूल्य बढ़ता रहता है और वास्तव में यादृच्छिक नहीं है।" - नहीं! –

+0

हां। बनाए गए मान 0.812, 0.814 और इतने पर हैं .. इसे कैसे ठीक करें? – lakesh

+2

@lakesh यदि कार्यक्रम के हर पुन: चलाने पर ऐसा होता है, [यहां] (http://stackoverflow.com/questions/17385541/c- पूर्वानुमानित-rand-output/17385746#17385746) स्पष्टीकरण है। –

उत्तर

8

कुछ मार्गदर्शन की आवश्यकता है ...

मार्गदर्शन 1:

सही तुलना, आप

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

का उपयोग करना चाहिए, क्योंकि वर्तमान में लाइन में if(probability <= (1/10)) आप 0 के साथ तुलना कर रहे हैं रूपांतरण की वजह से 1/101/3 और 2/3 पूर्णांक

मार्गदर्शन करने के लिए 2:,

सब के बाद आप के साथ बेहतर 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

यादृच्छिक संख्या जेनरेटर ** नहीं ** समस्या है। समस्या उन संभावनाओं की तुलना कर रही है जिनके मूल्य 0 और 1 के बीच '1/3' जैसे अंशों के साथ हैं; इन अंशों के मूल्य हमेशा 0 –

+1

मुझे लगता है कि आपको पूर्णांक ओवरफ़्लो समस्या से बचने के लिए 'रैंड()/((डबल) RAND_MAX + 1) का उपयोग करना चाहिए। – tidy

0

की आवश्यकता है अपने मामलों में जहां आप संभावना आप पूर्णांक प्रभाग है तुलना के सभी में, जिसके परिणामस्वरूप 0 ... (2/3) के बजाय आप (2/(double)3) या 2/3.0 चाहते थे।

+2

हालांकि यह सच है, यह पूछे जाने वाले प्रश्न का उत्तर नहीं देता है। xD –

+1

@ जे.सी.Leitão - उम, हाँ, यह सवाल का जवाब देता है। जिस तरह से कोड लिखा गया है, यह ** लगभग हमेशा ** शेयर मूल्य में वृद्धि करेगा। –

+0

@PeteBecker मुझे लगता है कि प्रश्न यादृच्छिक संख्या के मूल्यों से संबंधित है, स्टॉक मूल्य नहीं। –

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

probabililty के बाद से कभी नहीं नकारात्मक है जनरेटर का उपयोग कर सकते इस कोड को होगा लगभग हमेशा वेतन वृद्धि stockPrice का मूल्य। एकमात्र ऐसा समय नहीं होगा जब probability 0 है। ऐसा इसलिए है क्योंकि 1/3पूर्णांक विभाजन है, और इसका मान 0 है। इन सभी अंशों को 1.0/3 जैसे कुछ में बदलें और चीजें बहुत बेहतर होंगी। और इसमें यादृच्छिक संख्या जनरेटर की गुणवत्ता के साथ कुछ भी नहीं है। कुछ लोगों को rand दिखाई देने पर इतना अभ्यास मिलता है कि उन्हें कुछ और दिखाई नहीं देता है।

हालांकि, कोड में स्केलिंग में एक दोष है। इसके बजाय

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

उपयोग

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

मूल रूप से लिखा के रूप में की, probability का मूल्य 1 जब भी rand() मूल्य RAND_MAX का उत्पादन होगा, और यह बहुत अधिक बार अन्य मूल्यों का उत्पादन करेगा।

संबंधित मुद्दे