एक समान यादृच्छिक चर का उपयोग करके गाऊसी यादृच्छिक चर को लागू करना


11

मैं एक C ++ फ़ंक्शन लिखने की कोशिश कर रहा हूं जो गौसियन यादृच्छिक मूल्यों को लौटाएगा, उनके साधन और संस्करण दिए जाएंगे।

एक लाइब्रेरी फंक्शन है rand(), जो 0और के बीच यादृच्छिक संख्या देता है RAND_MAXRAND_MAXइसका कोई निश्चित मान नहीं है, लेकिन यह गारंटी है कि यह कम से कम । इसकी पीडीएफ एकसमान है।2151

मैं इसे rand()एक गाऊसी चर में बदलने के लिए सेंट्रल लिमिट प्रमेय का उपयोग कर रहा हूं । मैं जो कुछ कर रहा हूं वह rand()एक उपयोगकर्ता द्वारा निर्दिष्ट समय के लिए कॉल करने के लिए है, फिर उनके रिटर्न मूल्यों को जोड़ें, फिर उपयोगकर्ता को निर्दिष्ट निर्दिष्ट साधन पर स्थानांतरित करें।

गॉसियन पीडीएफ
ऊपर प्लॉटिंग में, मैंने अपने गौसियन यादृच्छिक जनरेटर को बार कहा, और इसके रिटर्न मानों की आवृत्तियों को प्लॉट किया। जैसा कि आप देखते हैं, इसका विचरण बहुत बड़ा है, क्योंकि यह बहुत सारे अन्य यादृच्छिक मूल्यों के योग से बनाया गया है।107

यह गॉसियन पीडीएफ और निर्दिष्ट माध्य मान के साथ एक गाऊसी चर को सफलतापूर्वक लौटाता है। हालाँकि, समस्या इसकी भिन्नता है। मैं इस बिंदु पर अटका हुआ हूं, क्योंकि मुझे नहीं पता कि उपयोगकर्ता के निर्दिष्ट मूल्य के लिए इसके संस्करण को कैसे बदलना है।

यह मेरा कोड है (अब के लिए अधूरा; पैरामीटर "वेरिएंस" को अनदेखा किया गया है):

template <class T>
T Random::GetGaussian(T Mean /*= 0*/, T Variance /*= 1*/)
{
    T MeanOfSum = NUM_GAUSSIAN_SUMS / static_cast<T>(2);
    T Rand = 0;
    for (uint64_t i=0; i<NUM_GAUSSIAN_SUMS; i++)
    {
        Rand += static_cast<T>(rand()) / RAND_MAX;
    }
    return Rand - (MeanOfSum - Mean);
}

मान लें कि NUM_GAUSSIAN_SUMS100 है, और RAND_MAX32767 है।

मैं फंक्शन के पैरामीटर के अनुसार रैंडम वेरिएबल के वेरिएशन को बदलना चाहता हूं। मेरा सवाल है, मैं इस यादृच्छिक चर के विचरण को कैसे बदल सकता हूं? मैं यह कैसे कर सकता हूं?


3
गाऊसी यादृच्छिक चर उत्पन्न करने के लिए केंद्रीय सीमा प्रमेय से बेहतर और तेज तरीके हैं। एक के लिए बॉक्स-मुलर विधि की खोज करें; एक ziggurat विधि को और भी बेहतर कहा जाता है।
दिलीप सरवटे


3
12 यू(0,1)1006एन(0,1)Y=σएक्स+μएन(μ,σ2)(μ-6σ,μ+6σ)

@DilipSarwate शायद आपको उन विकल्पों को एक औचित्य के साथ उत्तर के रूप में पोस्ट करना चाहिए कि हम इसे क्यों पसंद करेंगे
Ivo Flipse

@IvoFlipse प्रश्न के उत्तर में पूछा गया है कि "मैंने इसका मतलब तय करने के बाद मैं विचरण कैसे तय करूं?" यह अनिवार्य रूप से हिल्मर द्वारा स्वीकार किए गए उत्तर को टिप्पणियों के अनुसार संशोधित करता है: स्केलिंग द्वारा विचरण को ठीक करें और फिर माध्य को फिर से ठीक करें, या बेहतर तरीके से, पहले माध्य को ठीक करने से शुरू न करें क्योंकि आपको फिर से ठीक करना होगा बाद में; स्केलिंग द्वारा पहले विचरण को ठीक करें और फिर माध्य को ठीक करें। ओपी यह संकेत नहीं देता है कि वह बेहतर तरीकों में दिलचस्पी रखता है और उसने निबोट के लिंक को भी नहीं हटाया है, जिसमें बॉक्स-मुलर विधि के लिए कोड भी है। इसलिए मैं चीजों को छोड़ दूंगा जैसे वे हैं।
दिलीप सरवटे

जवाबों:


6

आपका प्रारंभिक एल्गोरिथ्म एक यादृच्छिक चर बनाता है जो समान रूप से 0 और 1 के बीच वितरित किया जाता है। उस का विचरण 1/12 है। यदि आप NUM_GAUSSIAN_SUMSउदाहरण देते हैं कि विचरण होगा NUM_GAUSSIAN_SUMS/12। लक्ष्य विचरण Vकरने के लिए, आपको सममित यादृच्छिक चर को गुणा करना होगा sqrt(V*12/NUM_GAUSSIAN_SUMS)

साइड नोट के रूप में, एक टेम्प्लेट फ़्लोट और डबल्स के लिए उचित रूप से काम करेगा लेकिन किसी भी निश्चित बिंदु प्रकार के साथ महत्वपूर्ण संख्यात्मक समस्याएं होंगी।


5

मैं इस यादृच्छिक चर के विचरण को कैसे बदल सकता हूँ?

सीएक्ससीएक्ससी2एक्स


सीएक्ससीएक्स

1
केंद्र, पुनर्विक्रय, फिर माध्य को पुनर्स्थापित करें। एक केंद्रित यादृच्छिक चर स्केलिंग (शून्य) माध्य को प्रभावित नहीं करेगा।
एम्रे

1

एक और तरीका है!

इसके बारे में सोचें, क्या होगा अगर आप गॉसियन के विपरीत कुछ और वितरण चाहते थे? उस स्थिति में आप वास्तव में केंद्रीय सीमा प्रमेय का उपयोग नहीं कर सकते हैं; फिर आप इसे कैसे हल करते हैं?

एक समान यादृच्छिक चर को मनमाने ढंग से पीडीएफ में बदलने का एक तरीका है। इस विधि को इनवर्स ट्रांसफॉर्म विधि कहा जाता है

यू[0-1]

एक्स=एफएक्स-1(यू)

एफएक्स(एक्स)

इसलिए, आपको बस इतना करना है कि उलटा सीडीएफ फ़ंक्शन को उस वेरिएबल पर लागू करें जिसे आपने समान आरवी के नमूने से पुनर्प्राप्त किया है।

इसके अलावा, पहले के तरीकों के विपरीत - इसके लिए किसी पुनरावृत्ति की आवश्यकता नहीं होगी और यह निर्भर नहीं करेगा कि गॉसियन के परिणाम को बंद करने के लिए कितने पुनरावृत्तियों को लिया जाएगा।

यहाँ एक संदर्भ है जो इस बात का प्रमाण देता है।


3
> एक और तरीका है! सच है, लेकिन विचाराधीन सवाल के लिए अप्रासंगिक जो विशेष रूप से गाऊसी यादृच्छिक चर के बारे में है। न तो गॉसियन सीडीएफ और न ही इसके व्युत्क्रम को परिचालनात्मक शब्दों में परिचालनात्मक संख्या का उपयोग करके व्यक्त किया जा सकता है, और इसलिए सुझाई गई विधि का उपयोग नहीं किया जा सकता है।
दिलीप सरवटे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.