इनपुट के रूप में एक उचित सिक्के को देखते हुए, कोई विशेष अनुचित परिणाम उत्पन्न करते हैं


13

अनुचित सिक्के का उपयोग करके एक उचित सिक्का उत्पन्न करना आसान है, लेकिन रिवर्स को पूरा करना कठिन है।

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

आपके प्रोग्राम को केवल स्रोत कोड में यादृच्छिक संख्या जनरेटर के एक रूप का उपयोग करने की अनुमति है: int(rand(2))(या समतुल्य), जो या तो शून्य या एक समान संभावना वाले रिटर्न देता है। आप इस फ़ंक्शन को अपनी कोड में जितनी बार चाहें उतनी बार शामिल या एक्सेस कर सकते हैं। आपको फ़ंक्शन को कोड के भाग के रूप में भी प्रदान करना होगा।

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

यह कोड गोल्फ है, सबसे छोटा उत्तर जीतता है।


इनपुट किस रूप में लेता है? अगर हम गारंटी देते हैं कि यह एक दिए गए आकार का IEEE-754 फ़्लोटिंग पॉइंट नंबर है, तो यह वास्तव में बहुत आसान है।
पीटर टेलर

जवाबों:


4

पर्ल, 37 42 चार

($d/=2)+=rand>.5for%!;print$d/2<pop|0

कमांड लाइन तर्क के रूप में मनमानी संभावना लेता है। में एक समान यादृच्छिक संख्या बनाता है $dऔर इसकी तुलना इनपुट से करता है।

इससे पहले, 52 चार समाधान

$p=<>;do{$p*=2;$p-=($-=$p)}while$--(.5<rand);print$-

1
मैं प्रभावित हूं कि आप इस समाधान का अनुकूलन करने के लिए 6 साल बाद वापस आए।
मिशा लावरोव

3

पायथन, 81 वर्ण

import random
print(sum(random.randint(0,1)*2**-i for i in range(9))<input()*2)+0

थोड़े से बंद हो सकते हैं, लेकिन 1% से अधिक कभी नहीं।


मुझे 1% से बहुत बेहतर लगता है। मैंने 0.01 के एक कदम के साथ [0,1] की संभावनाओं के लिए आपके कार्यक्रम को 100,000 बार चलाया और random.random() < desiredProbabilityइस स्क्रिप्ट का उपयोग करके इसकी तुलना की : gist.github.com/3656877 वे पूरी तरह से मेल खाते हैं i.imgur.com/Hr8uE.png
मैट

हालांकि, उम्मीद के मुताबिक, random.random() < xकाफी तेज है।
मैट

3

गणितज्ञ १६५

सुव्यवस्थित नहीं है, लेकिन कुछ ब्याज की एल्गोरिथ्म पा सकते हैं:

d = RealDigits; r = RandomInteger;
f@n_ := If[(c = Cases[Transpose@{a = Join[ConstantArray[0, Abs[d[n, 2][[2]]]], d[n, 2][[1]]], 
         RandomInteger[1, {Length@a}]}, {x_, x_}]) == {}, r, c[[1, 1]]]

प्रयोग

f[.53]

1

चेक

आइए देखें कि क्या f[.53]वास्तव 1में समय का लगभग 53% मूल्य का उत्पादन होता है । प्रत्येक परीक्षण 10 ^ 4 के नमूनों के लिए% की गणना करता है।

50 ऐसे परीक्षण चलाए जाते हैं और औसत होते हैं।

Table[Count[Table[f[.53], {10^4}], 1]/10^4 // N, {50}]
Mean[%]

{0.5292, 0.5256, 0.5307, 0.5266, 0.5245, 0.5212, 0.5316, 0.5297, 0.5334, 0.5336, 0.5288, 0.5288, 0.5379, 0.5263, 0.5393, 0.5322, 0.5195, 0.5208, 0.5382, 0.5382, 0.5432, 0.5432, 0.543 , 0.5297, 0.5318, 0.5243, 0.5281, 0.5361, 0.5349, 0.5308, 0.5265, 0.5233, 0.5345, 0.5316, 0.5376, 0.5264, 0.5269, 0.5295, 0.5296, 0.5326, 0.5316, 0.53164, 0.5334, 4334, 4334 }

0.529798

परिणामों का हिस्टोग्राम

हिस्टोग्राम

स्पष्टीकरण (स्पॉइलर अलर्ट!)

.53 का आधार 2 निरूपण है

.10000111101011100001010001111010111000010100011110110

बाएं से दाएं आगे बढ़ना, एक समय में एक अंक:

यदि RandomInteger [] 1 लौटाता है, तो उत्तर = 1,

दूसरा यदि दूसरा रैंडमइंटर [] 0 लौटाता है, तो उत्तर = 0,

और यदि तीसरा रैंडमइन्टेगर [] 0, उत्तर = 0 देता है,

अन्य....

यदि, जब सभी अंकों का परीक्षण किया गया है, तब भी कोई जवाब नहीं है, तो जवाब दें = randomInteger []।


1

हास्केल, 107 वर्ण:

import System.Random
g p|p>1=print 1|p<0=print 0|1>0=randomIO>>=g.(p*2-).f
f x|x=1|1>0=0.0
main=readLn>>=g

0

वोल्फ्राम भाषा (गणितज्ञ) , 42 बाइट्स

RandomInteger[]/.⌈1-2#⌉:>#0@Mod[2#,1]&

इसे ऑनलाइन आज़माएं!

यह एक पुनरावर्ती दृष्टिकोण है। Ungolfed, एल्गोरिथम है:

  • यदि इनपुट संभावना p१/२ से कम है, तो जब सिक्का ० ऊपर आता है, ०. वापसी ०. अन्यथा, पुनरावृत्ति करें 2p; शुद्धता मानकर, 1 प्राप्त करने की समग्र संभावना आधी है 2pया p
  • यदि इनपुट संभावना p1/2 से अधिक है, तो जब सिक्का 1 ऊपर आता है, तो 1. वापस करें, अन्यथा, फिर से शुरू करें 2p-1; शुद्धता मानकर, 0 प्राप्त करने की समग्र संभावना आधी है 1-(2p-1)या 1-p

इसे कम करने के लिए, हम यादृच्छिक सिक्काफ्लिप के साथ शुरू करते हैं, जो कि किसी भी शाखा में, आधे समय में वापस हो जाता है। अगर हम इसे वापस करने के लिए चाहिए, तो यह केसफ्लिप उस मामले से मेल नहीं खाता है, इसे 2pmodulo 1 पर पुनरावृत्ति करने के परिणाम से बदलें । (अर्थात, जब p1/2 से कम हो, 1 को प्रतिस्थापित करें; p1/2 से अधिक होने पर; , बदलें 0. यह जगह के बराबर है ⌈1-2p⌉।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.