टूटे हुए यादृच्छिक फ़ंक्शन को ठीक करें


18

एक मित्र के कंप्यूटर में एक ऐड-ऑन कार्ड होता है जो 1 से 5 समावेशी से पूरी तरह यादृच्छिक संख्या उत्पन्न करता है। दुर्भाग्य से, उन्होंने किसी तरह इस पर कोला फैलाया, और यह अब 1 से 4 तक सभी नंबरों के लिए केवल 2 उत्पन्न करता है। सौभाग्य से यादृच्छिकता संरक्षित है, लेकिन 2 में 80% की संभावना है और 5 में 20% की संभावना है, और कोई भी नहीं है 1 का, 3 या 4 का जेनरेट किया गया। इस यादृच्छिक स्रोत (इसे कॉल करें BrokenRand()या कुछ इसी तरह का) का उपयोग करके , एक काम कर रहे यादृच्छिक संख्या जनरेटर को लिखें जो मूल स्रोत के समान समान यादृच्छिकता के साथ समान 20% संभावना के साथ 1 से 5 तक संख्या पैदा करता है।

सबसे छोटा कार्यक्रम जीतता है। बोनस अंकों को न्यूनतम रूप BrokenRandसे एक डेमोक्रेटिक रूप से चयनित ग्राहक सेवा फ़ोकस कंसल्टेंसी द्वारा निष्पक्ष रूप से, उम्र और लिंग से टूट जाने के कारण - यानी मुझे।

जवाबों:


10

जावास्क्रिप्ट - 69 वर्ण

यह निष्पक्ष बिट्स उत्पन्न करने के लिए वॉन न्यूमैन एक्सट्रैक्टर का उपयोग करता है ; HotBits वेबसाइट पर सामान्य एल्गोरिथ्म का भी वर्णन किया गया है । तीन बिट्स का उपयोग 0 से 7. की संख्या बनाने के लिए किया जाता है। सभी संख्याओं को 5 और इसके बाद के संस्करण को छोड़ दिया जाता है, और बाकी सभी को मुद्रित करने से पहले उनमें से प्रत्येक में जोड़ा जाता है। मैंने यह दिखाने के लिए एक अनुकरण किया कि यह भारी पक्षपाती नहीं है

r()RNG तक पहुँचने के लिए आपको अपना स्वयं का फ़ंक्शन प्रदान करना होगा ।

 for(;;v<5&&alert(v+1))for(v=i=0;i<3;a-b&&(v*=2,v+=a<b,i++))b=r(a=r())

यह वास्तव में अच्छी तरह से किया है! मुझे पसंद है कि आप वेतन वृद्धि का शॉर्ट सर्किट कैसे करते हैं।
14

आप BrokenRand पर कॉल को कम करने के लिए 7 बिट्स उत्पन्न कर सकते हैं और 3 यादृच्छिक संख्याएँ निकाल सकते हैं, लेकिन इससे कुछ अधिक स्ट्रोक की संभावना होगी
gnibbler

5

scala 79 वर्ण:

// preparation: 
val r = util.Random 
def defektRNG = if (r.nextInt (5) == 0) 5 else 2 

(1 to 20).foreach (_ => print (" " + defektRNG))
// first impression:
// 2 2 2 2 2 2 2 5 2 2 5 2 2 2 5 2 2 2 2 2

def rnd : Int = { val k = (1 to 5).map (_ => defektRNG)
  if (k.sum == 13) k.findIndexOf (_ == 5) + 1 else rnd } 

// first impression:
(1 to 20).foreach (_ => print (" " + rnd))             
// 3 3 2 3 5 2 2 5 1 1 3 4 3 2 5 3 3 1 5 4
// control:
(1 to 50000).map (_ => rnd).groupBy (identity) .map (_._2.length) 
// scala.collection.immutable.Iterable[Int] = List(10151, 9997, 9971, 9955, 9926)

अब असली गोल्फ के लिए, defektRNG उर्फ ​​टूटा हुआ नाम बदलकर b है।

def r:Int={val k=(1 to 5).map(_=>b)
if(k.sum==13)k.findIndexOf(_==5)+1 else r} 

यह कैसे काम करता है: सबसे अधिक बार, बी 2 एस का एक क्रम देता है। लेकिन अगर आप बी को 5 कॉल करते हैं, तो आप अक्सर 4x2 और 1x5 के परिणाम के साथ समाप्त हो जाएंगे, यह दूसरी सबसे संभावित घटना है, और 5-2-2-2-2, 2-5-2-2 हो सकता है -2, 2-2-5-2-2, 2-2-2-5-2 और 2-2-2-2-5।

ये सामान्य रूप से हैं, यह योग 4 * 2 + 5 = 13 है। पहले पाँच के सूचकांक का उपयोग एक वैध यादृच्छिक संख्या को परिभाषित करने के लिए किया जा सकता है। यदि एक या एक से कम ५, अधिक से अधिक १३ या उससे कम राशि हो, तो दोहराएं।

'Rnd' aka 'r' में एक काउंटर दिखा सकता है कि संख्याओं के उत्पादन के लिए औसतन कितने कॉल आवश्यक हैं। 50 000 यादृच्छिक संख्याओं के लिए 121 200 कॉल आर हैं, जो प्रभावित नहीं कर रहा है। :)


3

> <> (मछली) - 55 बाइट्स

अपने स्कैला उत्तर में अज्ञात के रूप में @ यूसर के समान एल्गोरिथ्म का उपयोग करने के लिए अपडेट किया गया

<? V = d + और: मैं और + और: मैं और + और: मैं और + और: मैं और: मैं
 0
 > 1 + $ 5 (vnao?
 ^ <

यह उम्मीद करता है कि टूटे जनरेटर को स्टड से जोड़ा जाए; यहाँ एक अजगर लिपि का उपयोग किया गया था । कोड वर्तमान मछली की कल्पना से मेल खाता है, लेकिन मैंने पुराने दुभाषिया के एक संशोधित संस्करण का उपयोग किया ।

bash:$ for i in $(seq 1000); do ./bad_rand.py | ./myfish.py rand.fish; done >res.txt
bash:$ for i in $(seq 5); do echo -n "$i : "; grep -c $i res.txt; done
1 : 193
2 : 204
3 : 198
4 : 206
5 : 199

मैं एक बड़ा नमूना करूँगा, लेकिन यह धीमा है।


2

GolfScript, 23 बाइट्स

देर से जवाब, लेकिन यह सिर्फ फ्रंट पेज पर पॉप अप करने के लिए हुआ ...

0{;[{r}5*].5?)\5-,4-}do

उपयोगकर्ता अज्ञात स्केला समाधान के समान एल्गोरिथ्म का उपयोग करता है । माना जाता है कि पक्षपाती यादृच्छिक संख्या जनरेटर को गोल्फस्क्रिप्ट उप-नाम के रूप में दिया जाता है r; आप अपने आप को एक उपयुक्त पक्षपाती RNG परिभाषित कर सकते हैं जैसे:

{5rand!3*2+}:r;

यहाँ पूर्वाग्रह की कमी का प्रदर्शन एक त्वरित परीक्षण है। दुर्भाग्य से, ऑनलाइन गोल्फस्क्रिप्ट सर्वर धीमा है, इसलिए मुझे इसे समय पर पूरा करने के लिए प्रदर्शन को सिर्फ 100 नमूनों तक काटना पड़ा। साथ स्थानीय रूप से परीक्षण चल रहा है, तो GolfScript दुभाषिया , को बढ़ाने का प्रयास 100*करने के लिए 1000*या यहां तक कि 10000*

(गोल्फस्क्रिप्ट सर्वर भी कभी-कभी बेतरतीब ढंग से जमा देता है और बार-बार बाहर निकलता है। यदि आपके लिए ऐसा होता है, तो फिर से कोशिश करना आमतौर पर इसे हल करता है। यह अन्य कोड के साथ भी होता है, और केवल सर्वर पर होता है, मेरे खुद के कंप्यूटर पर नहीं, इसलिए मुझे विश्वास है।) यह सर्वर के साथ एक समस्या है और मेरे कोड के साथ नहीं है।)


-1

जावास्क्रिप्ट, 160 वर्ण पठनीयता उर्फ अनुकूलन को कम करने के बिना

function giveRandom(){
    var result = Math.floor(5 * Math.random()) + 1;
    while(BrockenRand() != 5){
        result = Math.floor(5 * Math.random()) + 1;
    }
    return result;
}

@ snmcdonald -some एक टाइपो नहीं है, यह एक संपूर्ण यादृच्छिक जनरेटर द्वारा यादृच्छिक रूप से js को बेहतर बनाने का एक तरीका है जो केवल (पूरी तरह से यादृच्छिक!) 20% परिणामों का परिणाम है
www0z0k

देखभाल करने के लिए क्या BrockenBand()है, तब समझाना ?
मतीन उल्हाक

6
मुझे लगता है कि आप बिंदु से चूक गए
cthom06

@ मंटू - अर्थBrockenRand
www0z0k

इस तरह से कुछ बाइट्स बचाएं:function giveRandom(){return Math.ceil(Math.random()*5)}
user300375
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.