2013-04-25 7 views
9

सी ++ 11 std :: uniform_real_distribution (-1, 1) सीमा [-1,1) में संख्या देता है।std :: uniform_real_distribution समावेशी रेंज

आप सीमा में एक समान वास्तविक वितरण कैसे प्राप्त करेंगे [-1,1]?

व्यावहारिक रूप से इससे कोई फर्क नहीं पड़ता लेकिन तर्कसंगत रूप से मैं समावेशी सीमा में एक मूल्य का चयन करने की कोशिश कर रहा हूं।

उत्तर

14

यह सोचना आसान है कि आप पूर्णांक को देखकर शुरू करते हैं या नहीं। यदि आप [-1, 1) पास करते हैं तो आपको -1, 0 प्राप्त होने की उम्मीद होगी। चूंकि आप 1 शामिल करना चाहते हैं, तो आप [-1, (1 + 1)), या [-1, 2) पास करेंगे। अब आपको -1, 0, 1 मिल गया है।

आप एक ही बात करना चाहता हूँ, लेकिन युगल के साथ:

उधार this answer से:

#include <cfloat> // DBL_MAX 
#include <cmath> // std::nextafter 
#include <random> 
#include <iostream> 

int main() 
{ 
    const double start = -1.0; 
    const double stop = 1.0; 

    std::random_device rd; 
    std::mt19937 gen(rd()); 

    // Note: uniform_real_distribution does [start, stop), 
    // but we want to do [start, stop]. 
    // Pass the next largest value instead. 
    std::uniform_real_distribution<> dis(start, std::nextafter(stop, DBL_MAX)); 

    for (auto i = 0; i < 100; ++i) 
    { 
    std::cout << dis(gen) << "\n"; 
    } 
    std::cout << std::endl; 
} 

है, अगला सबसे बड़ा डबल लगता है (कोड रन here देखें) आप जो चाहते हैं उसके बाद मूल्य, और इसके बजाय अंत मूल्य के रूप में पास करें।

+1

अद्भुत, धन्यवाद। वीएस2012 में यह फ़ंक्शन नहीं दिखता है लेकिन सौभाग्य से इसे [गणित टूलकिट] में शामिल किया गया है (http://www.boost.org/doc/libs/1_53_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/ next_float/nextafter.html) –

+0

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

1

दुर्भाग्य से फ़्लोटिंग पॉइंट वितरण के वास्तविक कार्यान्वयन आपको इतना सटीक होने की अनुमति नहीं देते हैं। उदा।, uniform_real_distribution<float> किसी दिए गए आधे रेंज में मूल्यों का उत्पादन करना है, लेकिन गोल करने वाले मुद्दों के कारण यह वास्तव में मूल्यों को एक समावेशी सीमा में उत्पन्न कर सकता है।

Here'sgenerate_cannonical के साथ समस्या का एक उदाहरण, और इसी तरह की समस्याएं अन्य वास्तविक_डिस्ट्रिब्यूशन के साथ होती हैं।

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