2009-10-08 17 views
7

यह एक अजीब सवाल की तरह लग सकता है, लेकिन मुझे यादृच्छिक संख्या जनरेटर कहां मिल सकता है जो सी या सी ++ में काम करता है जो बहुत अच्छा नहीं है?क्रैपी रैंडम नंबर जेनरेटर

संदर्भ: मैं कुछ वृक्ष ग्राफ प्लॉटिंग सॉफ़्टवेयर बना रहा हूं और बहु-अंक यादृच्छिक संख्याओं का उपयोग करके इसका परीक्षण कर रहा हूं (इसलिए प्रत्येक अंक पेड़ में नोड बन जाता है)। मैं यादृच्छिक संख्या जनरेटर का उपयोग कर रहा हूं - जो कि जीएनयू सी ++ कंपाइलर के साथ आता है - मुझे मूल्यों का एक अच्छा प्रसार देता है। यह अच्छा है, लेकिन मैं देखना चाहता हूं कि तालिका कैसे दिखती है जब संख्या एक साथ मिलती है और कम समरूप होती है।

क्या कोई यादृच्छिक संख्या जेनरेटर सुझा सकता है जो कि यादृच्छिक साबित हुआ है?

(ओह, कोई भी जो xkcd से लिंक करता है और/या सुझाव देता है कि मैं केवल 4 लौटाता हूं, प्रतिक्रिया में कटाक्ष हो जाएगा)।

+6

चूंकि आपको एक्सकेसीडी पसंद नहीं है, तो आप 9: http://web.archive.org/web/20011027002011/http://dilbert.com/comics/dilbert/archive/images/dilbert2001182781025.gif –

+1

वापस कर सकते हैं आपको अपने अपेक्षित वितरण को बेहतर तरीके से परिभाषित करने की आवश्यकता है: उदाहरण के लिए, कोई सभ्य पीआरएनजी आपको 'रैंड()% 3' (मॉड्यूलो पूर्वाग्रह के कारण) के लिए एक गैर-वर्दी वितरण प्रदान करेगा, लेकिन मुझे संदेह है कि आपकी योग्यता पूरी होती है। –

+0

किस सीमा से अधिक है? –

उत्तर

0

srand का उपयोग करें, लेकिन इसमें एक बीज जोड़ें जो ज्यादा नहीं बदलता है। वास्तव में, सभी छद्म-यादृच्छिक-संख्या-जनरेटर इस तरह से व्यवहार करते हैं।

मूल रूप से, केवल 1 के साथ बीज, फिर 2 तो 3 .. बहुत जल्द आप देखेंगे कि "यादृच्छिक" संख्याएं इतनी यादृच्छिक नहीं हैं।

+0

क्या आप एक नया नंबर प्राप्त करने से पहले हर बार शोधन का सुझाव दे रहे हैं? – thornate

+0

हाँ .. यदि आप हर बार फिर से बीज करते हैं, तो आप अनिवार्य रूप से पीआरएनजी तोड़ते हैं क्योंकि इसकी अगली संख्या उत्पन्न होती है। यदि आप बीज दोहराते हैं, तो यह सबसे खराब हो जाता है, वही संख्या उत्पन्न होता है। –

0

असल में, रैंड() फ़ंक्शन वास्तव में काफी खराब है। मैं GameRand का उपयोग करता हूं जो वास्तव में सरल है, और सभ्य परिणाम उत्पन्न करता है, लेकिन यह अभी भी आपके लिए पर्याप्त नहीं हो सकता है।

+0

यह निर्भर करता है। मेरा मानना ​​है कि जीसीसी/जीएलआईबीसी 'रैंड()' के साथ 'रैंड()' लागू करता है और यह कि उनके पीआरएनजी वास्तव में बहुत अच्छे हैं। –

+0

उद्धरण: http://www.gnu.org/s/libc/manual/html_node/BSD-Random.html#BSD- यादृच्छिक उद्धरण: "जीएनयू सी पुस्तकालय के साथ इन कार्यों का उपयोग करने का कोई फायदा नहीं है; हम उनका समर्थन करते हैं केवल बीएसडी संगतता के लिए। " तो कोई भी डेटा जो 'रैंड() 'से बीएसडी की' यादृच्छिक() 'की तुलना करता है, वह जीएलआईबीसी पर लागू नहीं होता है। –

1

एक C++ समाधान:

class ClumpedRandom 
{ 
    public: 
    ClumpedRandom(int maxClumpSize) 
    : mMaxClump(maxClumpSize) 
    , mCurrentClumpSize(0) 
    , mCurrentCount(0) 
    { 
     if (!sInitialized) { 
     sInitialized = true; 
     srand(time(NULL)); 
     } 
    } 

    int operator()() 
    { 
     if (++mCurrentCount >= mCurrentClumpSize) { 
     // Need a new clump: 
     mCurrentClumpSize = rand() % mMaxClump; 
     mCurrentCount = 0; 
     mCurrentValue = rand(); 
     } 

     return mCurrentValue; 
    } 


    private: 
    static bool sInitialized; 
    int mMaxClump; 
    int mCurrentClumpSize; 
    int mCurrentCount; 
    int mCurrentValue; 
}; 

यह वही यादृच्छिक संख्या मूल्य के सबसे maxClumpSize उदाहरणों में से यादृच्छिक लंबाई रन पैदा करता है। (मैंने यह स्पष्ट रूप से नहीं कहा ... उम्मीद है कि आपको विचार मिल जाएगा)।

+0

आप अपने सीटीआर में 'srand()' क्यों नहीं करते? आपके पास एक निजी स्थैतिक चर हो सकता है जो आपको बताता है कि आपने 'srand()' या नहीं कहा है, और यदि आपने इसे कॉल नहीं किया है। यह काफी सरल है (हालांकि यदि आपका उपयोगकर्ता अपने आप पर 'srand() 'कहता है तो यह असफल हो सकता है)। –

+1

@ क्रिस: मैंने इसके बारे में सोचा था लेकिन अगर उसने कई क्लम्प्ड रैंडम ऑब्जेक्ट्स बनाये तो srand() 'से अधिक बार कोई फायदा नहीं हुआ। अपने स्वयं के कोड में मैं सचमुच स्वतंत्र धाराओं को आश्वस्त करने के लिए srand()/rand() के बजाय एक राज्यव्यापी पीआरएनजी ऑब्जेक्ट का उपयोग करूंगा। अपने आवेदन की तरह लगता है कि वास्तव में गुणवत्ता के बारे में चिंता करने की ज़रूरत नहीं है, हालांकि ... –

+0

@ क्रिस: ओह, मैंने आपको पहले गलत तरीके से पढ़ाया था। निश्चित रूप से, हम ऐसा कर सकते हैं ... आगामी संपादन ... –

7

मैंने हमेशा खराब यादृच्छिक संख्या जेनरेटर के गॉडफादर के रूप में randu के बारे में सोचा है।

+0

सहमत। रंदू एक क्लासिक है। – Boojum

3

लागू एक काफी कम Linear Feedback Shift Register सी में थोड़ा हेरफेर का उपयोग करके

LFSRs पर प्रकाशित सामग्री के अधिकांश अधिक से अधिक दृश्यों पर ध्यान केंद्रित करेंगे, लेकिन जैसे आप इनमें से किसी एक तोड़फोड़ एक छोटी अनुक्रम तैयार कर सकते हैं यह लग रहा है, के साथ थोड़ा प्रयोग

1

जीसीसी का उपयोग जारी रखने के दौरान आप क्लस्टरिंग शुरू कर सकते हैं एक तरीका है यादृच्छिक रूप से दो यादृच्छिक संख्याओं को यादृच्छिक रूप से दो & ऊपरी ब्रैकेट्स के पुनरावृत्ति संख्या के लिए लेना है। इसे कुछ बार करें और आपको यादृच्छिक क्लस्टरिंग मिलनी चाहिए।

1

बाधाओं के साथ एक यादृच्छिक संख्या जनरेटर (Wikipedia PRNG page) का उपयोग करें।

कुछ अन्य संभावनाओं: UChicago, UMich, FSU

3

Boost library कार्यों प्रदान करता है सामान्य वितरण जो दिलचस्प आकार का पेड़ उत्पन्न हो सकता है सहित विभिन्न असमान वितरण, में फैला यादृच्छिक मान उत्पन्न करने के लिए।

2

सी मानक चलता है:

static unsigned long int next = 1; 

int rand(void) // RAND_MAX assumed to be 32767 
{ 
    next = next * 1103515245 + 12345; 
    return (unsigned int)(next/65536) % 32768; 
} 

void srand(unsigned int seed) 
{ 
    next = seed; 
} 

एक सरल रैखिक congruential जनरेटर (LCG) के रूप में, यह बुरा नहीं है (स्थिरांक आप इस्तेमाल कर सकते हैं के कई और भी खराब सेट देखते हैं), लेकिन यह निश्चित रूप से एक नहीं है क्रिप्टोग्राफिक और पास-क्रिप्टोग्राफिक छद्म-यादृच्छिक संख्या जेनरेटर के ब्रह्मांड के अन्य सदस्यों की तुलना में अच्छा छद्म-यादृच्छिक संख्या जेनरेटर। यह आपके लिए पर्याप्त खराब हो सकता है, या आप संख्याओं के अन्य बुरे सेटों को देखने के लिए Knuth वॉल्यूम 2 ​​से परामर्श कर सकते हैं। (मेरे (पुराने) Sedgewick की प्रति बुरा स्थिरांक के कुछ चित्र के साथ यादृच्छिक संख्या पर एक नहीं बल्कि कम अध्याय 35 है।)

1

इस यादृच्छिक समारोह पर एक नज़र डालें:

http://xkcd.com/221/

+0

मैं चाहता हूं कि वह पूछ रहा था! Xkcd :) .. "(ओह, कोई भी जो xkcd से लिंक करता है और/या सुझाव देता है कि मैं केवल 4 लौटा दूंगा) प्रतिक्रिया में कटाक्ष हो जाएगा।" – warren

+1

तो सच है, तो मुझे अपना "जवाब में कटाक्ष मिलेगा"! डाउनमोडिंग! = कटाक्ष! – Rick

1

Chapter 7 of the Numerical Recipes in C पुस्तक एक के पते यादृच्छिक संख्या जनरेटर की विविधता। धारा 7.7 में अर्ध- (यानी, उप-) यादृच्छिक अनुक्रम शामिल हैं।

0

अक्सर क्रैपी यादृच्छिक दिखने वाले नंबरों के लिए, और मुझे आमतौर पर निर्धारक की आवश्यकता होती है, मैं बड़े-आश मानों और चरण मॉड्यूलेशन के साथ सरल अभिव्यक्तियों की साइन और कॉसिन की गणना करता हूं। आमतौर पर मैं ग्राफिक्स प्रयोजनों के लिए दो आयामों में रंग पैदा कर रहा हूँ ("प्रक्रियात्मक बनावट" और जो कुछ) तो मुझे लगता है कि सामान्य स्यूडोकोड में की तरह एक उदाहरण देता हूँ:

for i=1,N 
    for j=1,N 
    value[i*n+j] = sin(51*i*i+cos(80*j)) + sin(300*j+3*sin(111*i-j)) 

अनियमितता के सबसे गंभीर परीक्षण विफल गारंटी। परिणाम इस तरह से क्रोधित हैं जो कला के लिए उपयोगी है।

बैठना और मल्टीला और मैटलप्लिब के साथ मैटलैब या पायथन जैसे इंटरैक्टिव प्लॉटिंग वातावरण में इन तरह के सूत्रों के साथ खेलना मजेदार है।

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