रैंडम जेनरेटर बदलने से पासा


10

परिचय

आपको निम्नलिखित कार्यान्वयन के साथ एक यादृच्छिक पूर्णांक जनरेटर दिया जाता है

  • पहला आह्वान हमेशा 1 देता है।
  • दूसरा आह्वान 1 और 2 के बीच एक यादृच्छिक पूर्णांक देता है।
  • तीसरा आह्वान 1 और 3 के बीच एक यादृच्छिक पूर्णांक देता है।
  • Nth मंगलाचरण 1 और n, समावेशी के बीच एक यादृच्छिक पूर्णांक देता है।

उपरोक्त फ़ंक्शन के आधार पर, एक यादृच्छिक पासा जनरेटर लिखें जो पूरी तरह से यादृच्छिक है, समान संभावना के साथ 1 और 6 (समावेशी) के बीच मान लौटाता है।

नियम

  • आपके प्रोग्राम / फ़ंक्शन का परिणाम रैंडम पूर्णांक 1 और 6 के बीच होना चाहिए, समावेशी, कुछ प्रयोग करने योग्य रूप में, अर्थात, मानक आउटपुट या फ़ंक्शन रिटर्न मान के रूप में।
  • ऊपर बढ़ते यादृच्छिक संख्या जनरेटर को आपके कार्यक्रम में "नि: शुल्क" फ़ंक्शन के रूप में परिभाषित किया जा सकता है (यानी, आपके चरित्र की गणना नहीं करता है), या एक अलग स्क्रिप्ट / प्रोग्राम जिसे आवश्यकतानुसार निष्पादित किया जाता है, राज्य ( n) को लगातार बना रहा है कॉल के बीच।
  • मान लें कि आपके कार्यक्रम के एकल उपयोग के मामले में कभी भी 1000 से अधिक पासा रोल नहीं मांगे जाएंगे, और 1अतिप्रवाह से बचने के लिए प्रारंभिक यादृच्छिक संख्या जनरेटर को 1000 पासा रोल के अंत में रीसेट किया जा सकता है n
  • आपका प्रोग्राम ऊपर बताए गए यादृच्छिक जनरेटर को छोड़कर यादृच्छिक संख्याओं के किसी अन्य स्रोत का उपयोग नहीं कर सकता है। आप निश्चित रूप से प्रत्येक एकल पासा रोल आउटपुट के लिए यादृच्छिक संख्या जनरेटर से कई यादृच्छिक संख्याओं का अनुरोध कर सकते हैं।
  • यह कोड-गोल्फ है, इसलिए टाई होने की स्थिति में विजेता सबसे छोटा जवाब या अधिकांश वोट होता है। यदि आप 1000 से कम उत्पन्न यादृच्छिक संख्याओं का उपयोग करके 1000 पासा रोल उत्पन्न कर सकते हैं, तो अपने आप को 10-बिंदु दक्षता बोनस दें

उदाहरण

./asc-rand
1 # random integer between 1 and 1
./asc-rand
1 # random integer between 1 and 2
./asc-rand
3 # random integer between 1 and 3
./asc-rand
4 # random integer between 1 and 4

# dice-gen generates random dice based on output of asc-rand program.
./dice-gen
3
./dice-gen
6
./dice-gen
5
./dice-gen
1

क्या कार्यक्रम iterate(6):b=asc-rand(); print bअवैध है या यह काम नहीं करता है? मैं तीसरे नियम को गलत समझ सकता हूं।
beary605 23

@ beary605: यादृच्छिक संख्या जनरेटर केवल पूरे 1000 पासा रोल के बाद रीसेट किया जा सकता है, हर पासा रोल के बीच नहीं। एकमात्र कारण जिसका मैं उल्लेख करता हूं कि यादृच्छिक संख्या जनरेटर द्वारा लौटाए गए मूल्य पर संभावित ओवरफ्लो से निपटना इस चुनौती में चिंता का विषय नहीं हैसंपादित करें: मैंने नियम के उद्देश्य को स्पष्ट किया, आशा है कि यह मदद करता है।
मेलमोकब

जब आप कहते हैं "यादृच्छिक संख्या" क्या आपका मतलब है "यादृच्छिक पूर्णांक" या "यादृच्छिक (छंटनी की गई) वास्तविक संख्या"? शायद कुछ अधिवेशन हैं जिनके बारे में मुझे जानकारी नहीं है।
डेविड 18

@DavidCarraher: बहुत अच्छी बात। मैं यादृच्छिक पूर्णांक था, और मुझे लगता है कि यह स्पष्ट नहीं है। मैं सवाल अपडेट करूंगा। संपादित करें: अपडेट किया गया।
मेलमोकब

1
क्या हमें रैंडमाइज़र से यह पूछने की अनुमति है कि उसने कितनी बार यादृच्छिक संख्याएँ उत्पन्न की हैं? मैं इस धारणा के तहत था कि हम नहीं कर सकते।
मैट

जवाबों:


2

जे - 13 चार

यह गोल्फस्क्रिप्ट के रूप में एक ही धारणा बनाता है: कि पासा की संख्या स्टड में है और हम पासा रोल की सूची बनाते हैं जो बाहर आने वाले हैं।

r=:1+?  NB. free random function
r>:i.".1!:1]1

विस्फोट से समझाया:

r=:1+?           NB. r(x) = 1 + a random number between 0 and n-1
           ]1    NB. input file handle
       1!:1      NB. read in a string
     ".          NB. convert to integer
 >:i.            NB. make a list of numbers, from 1 to that integer
r                NB. apply the random function

यदि वह किसी तरह असंतोषजनक है, तो यहां एक लंबा, 21-चार कार्यक्रम है, जिसे f''यादृच्छिक संख्या उत्पन्न करने के लिए कहा जा सकता है , जिसमें एक राज्य और सब कुछ हो सकता है।

r=:1+?  NB. free random function
c=:0
f=:3 :'r c=:1+c'

K analogues: फ्री रैंडम फंक्शन r:{*1_draw x}, स्टडिन वर्जन (10 char) r'1+!. 0:` , फंक्शन वर्जन (14 char) c:0;f:{r@c+:1}जिसे कहते हैं f[]
अल्गोरिद्मार्क

6

पायथन, 31 वर्ण

इसी तरह से, इस तरह से जनरेटर को परिभाषित करें:

from random import randint
n=0
def r():
    global n;n+=1
    return randint(1,n)

फिर पासा रोल वापस करने के लिए एक समारोह:

D=lambda:eval('r(),'*6)[-1]%6+1

कॉल D()किसी भी समय आप एक समान रूप से यादृच्छिक पासा रोल की जरूरत है।


आह, eval का चतुर उपयोग, मुझे यह पसंद है।
स्कैल्वर

3

स्काला २३

def s={r;r;r;r;r;r%6+1}

विधि r इस प्रकार लागू की जा सकती है (लगभग):

var cnt = 0 
val rnd = new util.Random 

def r = {
  cnt %= 1000
  cnt += 1
  rnd.nextInt (cnt)
}

एक मोटा परीक्षण:

scala> (1 to 6).map (i => ((1 to 600) map (_=>s)).filter (_ == i).size)
res26: scala.collection.immutable.IndexedSeq[Int] = Vector(110, 105, 91, 96, 106, 102)

हर 6 वें कॉल को 6 मानों पर एक समान वितरण का उत्पादन करना चाहिए, इसलिए मैं 5 को फेंक देता हूं।


2

गोल्फस्क्रिप्ट (15 वर्ण)

यह मानता है कि आवश्यक रोल की संख्या स्टड पर आपूर्ति की जाती है और सूचीबद्ध करती है कि कई परिणाम स्टडआउट हैं।

# The free increasing random function
0:N;{N):N rand)}:r;

~{r{;r}5*6%)n}*

ऑनलाइन डेमो

जबकि मैं 1000 नंबर उत्पन्न करने के लिए 1000 से कम रोल का उपयोग करने के लिए 10 बिंदु बोनस प्राप्त कर सकता था, मुझे 10 से अधिक वर्णों की लागत आएगी। उपयुक्त एन्ट्रापी निकालने का तुच्छ दृष्टिकोण जब N 2 या 3 की शक्ति का एक गुणक होता है, तो परिणाम बहुत कम आता है क्योंकि उपलब्ध mod 3 की संख्या केवल 333 + 111 + 37 + 12 + 4 + 1 = 498 है। इसलिए यह आवश्यक है एक नमूना-और-अस्वीकार दृष्टिकोण। इस दृष्टिकोण का उपयोग करके आप 1000 कॉल से अपेक्षित 2242 रोल प्राप्त कर सकते हैं r, लेकिन बुक-कीपिंग से अतिरिक्त ओवरहेड है और baseयह एक बहुत लंबा फ़ंक्शन नाम है।


5
"और baseयह एक बहुत लंबा फ़ंक्शन नाम है" आप स्पष्ट रूप से गणितज्ञ का उपयोग नहीं करते हैं । हम के रूप में ऐसे चमत्कार मिल NegativeBinomialDistribution, ExponentialGeneratingFunction, MathieuCharacteristicExponent, InverseFourierSequenceTransform, और SemialgebraicComponentInstances। :-)
श्री। छिपकली

1

पायथन 65 63

i=7
while i>5:[R()for x in range(9)];i=int(`R()`[-1])
print i+1

फ़ंक्शन R()आरोही रैंडमाइज़र है।

उपयोग:

$ ./rollDice.py
3
$ ./rollDice.py
5

अपने forपाश से छुटकारा क्यों न लें और Rअपने whileपाश से पहले सिर्फ एक बार फोन करें ?
कीथ रान्डेल

@KeithRandall मेरे पासा रोल के रूप में मैं जिस नंबर पर लौटता हूं वह संख्या का अंतिम अंक है जो आरोही जनरेटर रिटर्न करता है। मुझे सभी संभावित अंकों के लिए समान संभावना सुनिश्चित करने के लिए आरोही जनरेटर के लिए 10 कॉल करने की आवश्यकता है।
मैट

क्यों 10 कॉल? सिद्धांत रूप में, यदि जनरेटर यादृच्छिक है, तो क्या प्रत्येक कॉल को (दस) अंकों में से किसी के लिए समान संभावना प्रदान नहीं करनी चाहिए? बेशक, व्यवहार में, आप केवल प्रत्येक संख्या के लिए समान गणना करने की उम्मीद कर सकते हैं।
डेविड ऑक्ट

@DavidCarraher जनरेटर 1 से n तक यादृच्छिक संख्या देता है जहां n यह संख्या है जिसे आपने इसे कॉल किया है। मैं इस लौटे नंबर के अंतिम अंक को देख रहा हूं। यदि n 10 का पूर्णांक नहीं है तो प्रायिकता एक समान नहीं होगी। उदाहरण के लिए: यदि n = 13 संभावनाएँ निम्नानुसार टूटेंगी: 1/9 रोल के लिए 1,5,6 और 2/9 रोल के लिए 2,3,4
मैट

@ मैट: मैंने माना R()कि एक फ्लोट लौट रहा था और आप कम से कम महत्वपूर्ण अंक हड़प रहे थे। अब जब यह स्पष्ट हो गया है कि R()एक पूर्णांक लौटाता है, तो यह समझ में आता है।
कीथ रान्डेल

1

पायथन, 56

r को इस प्रकार परिभाषित किया गया है:

from random import randint
n=0
def r(z):
    global n;n+=1
    return randint(1,n)

पासा जनरेटर डी:

import math;d=lambda:math.ceil(6.*r(r(r(r(r(r(0))))))/n)

उपयोग, उदाहरण के लिए, 100 रोल के लिए:

for i in range(100):print d()

आप शायद नष्ट कर सकते हैं import mathअगर आप को बदलने के math.ceil(...)साथint(...)+1
मैट

मैं करूँगा, लेकिन यह एक संभावित आउटपुट के रूप में 7 का उत्पादन करेगा।
स्कैल्वर

अरे हां। मैंने यह खो दिया।
मैट

mellamokb ने आरोही रैंडमाइज़र के बारे में एक प्रश्न स्पष्ट किया। आपको इसे n के लिए पूछने की अनुमति नहीं है।
मैट

1

गणितज्ञ ५१

रैंडम संख्या जनरेटर, rवैश्विक चर nको 1 पर सेट करके रीसेट किया जाता है ।

n = 1; r[c_] := RandomInteger[{1, c}]

कोड

सबसे छोटे कोड के लिए नहीं चल रहा है ...

h := (n++; If[n < 4 \[Or] (y = r@n) > 6 Quotient[n, 6], h, y~Mod~6 + 1])

प्रयोग

t = Table[h, {60000}];
n
SortBy[Tally[t], First]

60031 पासा के रोल के लिए 60031 कॉल की आवश्यकता थी hTallyसंख्या 1-6 से टूटना दर्शाता है।

60031

{{1, 9923}, {2, 9966}, {3, 10016}, {4, 10028}, {5, 10009}, {6, 10058}}


1

पर्ल, 22 या 45

आरोही यादृच्छिक संख्या जनरेटर का कार्यान्वयन:

my $n=0;
sub r { $n++; return 1+int(rand$n); }

सृजन:

#copy of the Scala solution; short code; uses 6N rolls
sub s{r;r;r;r;r;1+r%6}
#more efficient implementation, uses approximately 6+N+lnN rolls
sub roll { do{$a=r-1}while($a>$n-$n%6);return 1+(1+$a)%6 }

परीक्षण बाहर:

n नंबर चिसकारे
1 10001867 0.348569
2 10004853 2.355161
3 9994395 3.141602
4 10000177 0.003133
5 9999227 0.059753
6 9999481 0.026936
टी 60000000 5.935154
60000000 पासा रोल ने 60000042 कॉल को r और 570.432735 सेकंड में लिया


0

x86 ओपकोड, 15 बाइट्स

f:  mov cx, 6
    call r ; return in AX
    loop $-3
    cwd
    div word [f+1]
    inc dx
    ret ; return in DX

जाहिरा तौर पर यह एक कम गुणवत्ता वाला पद है?
मुहम्मद सलमान

0

GolfScript , 8 बाइट्स

f;3f*f(-

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

यह एक बार जनरेटर को पॉप करता है, फिर परिणाम से छुटकारा पाता है। फिर यह f2 को रोल करता है, और इसे 3 (3 या 6) से गुणा करता है, फिर f3-1 (0, 1, 2) को घटाता है, जिसके परिणामस्वरूप (3-2, 3-1, 3-0) या (6-2) होता है 6-1, 6-0) डब्ल्यू 5।

इस प्रश्न को पोस्ट करने से पहले गोल्फस्क्रिप्ट और रैंडम फ़ंक्शन मौजूद था, इसलिए यह एक कानूनी सबमिशन है।

यह केवल-एक बार सबमिट करना है। यदि आपको इसे एक कॉल में कई बार चलाने की आवश्यकता है,

GolfScript , 12 बाइट्स

f;3f*f-)0:i;

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

यह आपके i कॉल को 0 पर रीसेट करता है इसलिए यह तदनुसार रहता है। यह TIO 50 यादृच्छिक परिणाम दिखाता है।


0

सी (जीसीसी) , 31 बाइट्स

f(i){for(i=5;i--;)c;i=~-c%6+1;}

हर 6 कॉल, 1 से 6 के बीच हर नंबर की संभावना उत्पन्न होने के बराबर है।

c है #defineएक फ़ंक्शन के लिए एक कॉल के रूप घ है, जो एकदम सही यादृच्छिक संख्या उत्पन्न करता है।

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

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