2013-02-14 29 views
11

मैं एक वातावरण है कि सुविधाओंएक 36 बिट यादृच्छिक संख्या जनरेटर

  • 36 बिट किसी के पूरक पूर्णांकों
  • अंकगणित +, -, *, / और शेष
  • तक ही सीमित में एक आवेदन पत्र लिख रहा हूँ लेखन AND या OR जैसे कुछ ऑपरेशन नहीं। लेकिन किसी के पूरक के कारण, XOR घटाव के बराबर है और NOT अस्वीकरण के बराबर है।
  • न्यूमेरिक ओवरफ्लो घातक है, इसलिए चुपचाप के लिए उपयोग नहीं किया जा सकता है
  • हां, सशर्त हैं: IF/THEN/ELSEIF/ELSE/IF

आदर्श रूप में, मुझे 35 या 36 बिट यादृच्छिक पूर्णांक चाहिए, लेकिन 25 बिट भी पर्याप्त होंगे।

linear congruential generator के मेरे बेवकूफ कार्यान्वयन पर्याप्त संख्याओं के आधार पर अतिप्रवाह में चलाते हैं और छोटे संख्याओं का उपयोग करते समय केवल थोड़ी सी बिट्स का उत्पादन करते हैं।

तो मैं या तो संख्या का एक सेट के लिए देख रहा हूँ एक, ग, मी कि बाधाओं में बिट्स की अधिकतम संख्या निकलेगा, या LCG की एक समझदार अनुकूलन 2 या अधिक संख्या गठबंधन करने के लिए।

एक प्रारंभिक बिंदु के रूप में, यहाँ मैं अब तक क्या उपयोग कर रहा हूँ है:

*DEFINE NextRandom . min,max resultVar 
* . This is a very shitty RNG. The numbers were never checked 
* . for suitability for a long-period linear congruential generator. 
* . But it yields numbers that look vaguely random. 
*CLEAR rq 
*CLEAR rr 
*SET RandZ = RandZ * 169687 + 347011  . RandZ is a global var. 
*DIVIDE RandZ BY 131072 GIVING rq, RandZ . Division yields a remainder 
*DIVIDE RandZ BY 4 GIVING rq 
*SET r0 = +[#,[#],1,1]     . r0 = argument 'min' 
*SET r9 = +[#,[#],1,2]     . r9 = 'max' 
*SET rd = r9 - r0 + 1 
*DIVIDE rq BY rd GIVING rq, rr 
*SET [#,[#],2,1] TO r0 + rr    . return in 'resultVar' 
*ENDDEFINE 

मामले में किसी को भी परवाह करता है, पटकथा भाषा एक यूनिसिस 2200 मेनफ्रेम ऑपरेटिंग सिस्टम में एसएसजी (प्रतीकात्मक धारा जनरेटर) है EXEC 8.


गंभीरता पर: यह आरएनजी परीक्षण डेटा उत्पन्न करने में काम करता है। यह राज्य रहस्यों या परमाणु मिसाइल कोड एन्क्रिप्ट नहीं कर रहा है। तो हम "मिशन महत्वपूर्ण" के बजाय "अच्छा होना" और "सर्वोत्तम प्रयास" के बारे में बात कर रहे हैं। मैं एक सुधार के बारे में खुश हूं लेकिन परम समाधान की तलाश नहीं कर रहा हूं। आप recursions के साथ 12 बिट पर 3 LCGs हो सकता था

x_i (एन) एक x_i = (n-1) + p_i (आधुनिक:

+0

क्या आपके पास सशर्त हैं? – Pubby

+0

बीज मूल्य उत्पन्न करने के लिए अब आपके पास जो चल रहा है, उसे चलाकर आप जो भी कर सकते हैं उसे सुधार सकते हैं। –

+0

@ पब्बी: हां, आईएफ/फिर/ईएलएसई/अंत में है। मैं इसे प्रतिबिंबित करने के लिए अपना प्रश्न अपडेट कर रहा हूं, धन्यवाद! –

उत्तर

6

यह एक रैखिक congruential यादृच्छिक संख्या जनरेटर है कि कर सकते हैं कभी नहीं अतिप्रवाह लिखने के लिए, स्टीफन लालकृष्ण पार्क और और उनके अखबार में कीथ मिलर डब्ल्यू demonstrateयादृच्छिक संख्या जनरेटर के रूप में संभव है: अच्छे के लिए खोजें हार्ड हैं:

function Random : real; 
        (* Integer Version 2 *) 
const 
    a = 16807; 
    m = 2147483647; 
    q = 127773; (* m div a *) 
    r = 2836; (* m mod a *) 
var 
    lo, hi, test : integer; 
begin 
    hi := seed div q; 
    lo := seed mod q; 
    test := a * lo - r * hi; 
    if test > 0 then 
    seed := test 
    else 
    seed := test + m; 
    Random := seed/m 
end; 

यहां एम 2^31-1 है, लेकिन आप इसे 36-बिट संख्याओं के उत्पादन के लिए बदल सकते हैं। चाल यह है कि बीज हाय और लो भागों में विभाजित है और अंतिम यादृच्छिक संख्या भागों को संक्षेप में उत्पन्न किया जाता है।

यदि आपको यह पसंद नहीं है, तो मेरे पास मेरे ब्लॉग पर यादृच्छिक संख्या जेनरेटर के lots हैं। शायद उनमें से एक आप जो चाहते हैं वह करेगा।

+0

मुझे इस ओवरफ्लो-सबूत-नेस के लिए इस कार्यान्वयन को पसंद है! धन्यवाद। मुझे लगता है कि मैं इसे एक भंवर दे दूंगा। यदि यह विज्ञापित के रूप में काम करता है तो यह मुझे 2 या 3 कॉल को छोटे-श्रेणी के आरएनजी में संयोजित करने से बचने की अनुमति दे सकता है। आपके ब्लॉग और पेपर के लिंक के लिए भी धन्यवाद - एक चुटकी में मैं कागज के कई उदाहरणों में से एक का उपयोग कर सकता हूं। –

+2

@ करलस्मोट्रिक्स, [पार्क-मिलर-कार्टर] (http://www.firstpr.com.au/dsp/rand31/) PRNG का उत्कृष्ट चर्चा और विश्लेषण है। कार्टर का अनुकूलन नाटकीय रूप से प्रदर्शन बढ़ाता है, और जटिलता को कम करता है। यह साइट 64 बिट्स के विचार को विस्तारित करने पर भी चर्चा करती है, जिससे आपकी आवश्यकताओं के लिए उत्पादन के उच्च 28 बिट्स को त्याग दिया जा सकता है। –

+0

एक आकर्षण की तरह कार्यान्वित और काम कर रहा है। मैंने रुचि के साथ लेख पढ़ा लेकिन सीधे ऊपर से अपना कोड अपनाया। चूंकि मेरे पास 36-बिट संस्करण के लिए अच्छे स्थिरांक नहीं हैं, इसलिए मैं आपके 32-बिट संस्करण का अपरिवर्तित उपयोग कर रहा हूं। यह सब अच्छा है क्योंकि मुझे केवल 25 बिट्स की आवश्यकता है। –

1

बस एक साधारण विचार है, मुझे लगता है कि यदि वास्तव में सबसे अच्छा है पता नहीं है 2^{12})

जिसमें विभिन्न प्राइम्स p_i हैं। यदि कोई बहुत बड़ा नहीं है (12-बिट कहें), यह कभी भी बह जाएगा नहीं। फिर, 3 12-बिट यादृच्छिक संख्याओं के साथ, आप 36-बिट यादृच्छिक पूर्णांक बना सकते हैं:

z (n) = x_0 (n) + 2^{12} x_1 (n) + 2^{24} x_2 (एन)

टिप्पणी करें कि यदि पी_आई प्राइम और अपेक्षाकृत बड़े हैं, तो 3 यादृच्छिक जेनरेटर काफी स्वतंत्र होना चाहिए, ताकि रणनीति ठीक होनी चाहिए।

कठिनाई के लिए एक अच्छा विकल्प होना है।

वैसे भी, इसका उपयोग करने से पहले, मुझे लगता है कि यह कुछ परीक्षण बेहतर होगा।

+0

मुझे आश्चर्य है कि मेरी अजीब पटकथा भाषा "करता है" रिकर्सन। मुझे लगता है कि यह करता है, लेकिन क्योंकि प्रक्रियाएं साइड इफेक्ट्स के अलावा अन्य मूल्यों को वापस नहीं करती हैं, इसलिए इस समाधान को दोबारा कोड करना मुश्किल हो सकता है! फिर भी, मूल विचार ध्वनि है; और यदि आरएनजी के पास पैरामीटर पैरामीटर हैं तो मुझे कुछ अच्छी लंबी अवधि मिलनी चाहिए। फिलहाल, मैं 0..9 99 रेंज में 2 नंबर उत्पन्न कर रहा हूं और उन्हें 6 अंकों की संख्या में जोड़ना चाहता हूं, जो मेरी आरएनजी की अवधि को रोकता है लेकिन कोई समस्या नहीं है। मैं अभी भी एक और अधिक सुरुचिपूर्ण सिंगल कॉल समाधान की तलाश में हूं। –

+0

ठीक है, आप इसे दूसरे उत्तर के समान ही 3 12-बिट पूर्णांक या 36 बिट पूर्णांक (जिसे आप विघटित करते हैं) से बना एक राज्य के साथ एक एकल रिकर्सन के रूप में कार्यान्वित कर सकते हैं। वैसे भी, दूसरे उत्तर का परीक्षण किया गया है, इसलिए निश्चित रूप से बेहतर है! –