गैंबलर की फॉलसी पासा


26

जुआरी का पतन एक संज्ञानात्मक पूर्वाग्रह है जहां हम गलती से उन चीजों की अपेक्षा करते हैं जो भविष्य में होने की संभावना कम होती है और ऐसी चीजें जो कुछ समय में नहीं हुई हैं, जल्द ही होने की अधिक संभावना है। आपका कार्य इसके एक विशिष्ट संस्करण को लागू करना है।

चुनौती का स्पष्टीकरण

एक फ़ंक्शन लिखें जो 1 और 6 के बीच एक यादृच्छिक पूर्णांक देता है, समावेशी। पकड़: पहली बार फ़ंक्शन चलाया जाता है, परिणाम समान होना चाहिए (1% के भीतर), हालांकि, प्रत्येक बाद की कॉल उन मूल्यों के पक्ष में तिरछी हो जाएगी जिन्हें पहले कम बार रोल किया गया है। विशिष्ट विवरण इस प्रकार हैं:

  • डाई अब तक उत्पन्न संख्याओं को याद करती है।
  • प्रत्येक परिणाम निम्न सूत्र के साथ भारित होता है: countmaxcountdie+1
    • उदाहरण के लिए, यदि रोल अब तक गिना जाता है तो [1,0,3,2,1,0] , वजन [3,4,1,2,3,4] , यह कहना है कि आप होंगे 4 को 2 से तुलना में अधिक रोल करने की संभावना है ।3
    • ध्यान दें कि सूत्र का अर्थ है कि एक रोल परिणाम को के समान भारित किया जाता[a,b,c,d,e,f][a+n,b+n,c+n,d+n,e+n,f+n]

नियम और मान्यताएँ

  • मानक I / O नियम और प्रतिबंधित खामियां लागू होती हैं
  • डाई रोल निर्धारक नहीं होना चाहिए। (यानी एक अस्थिर स्रोत से प्राप्त PRNG का उपयोग करें, जैसा कि आमतौर पर एक बेसिन के रूप में उपलब्ध है।)
  • आपके यादृच्छिक स्रोत की अवधि कम से कम 65535 होनी चाहिए या सही यादृच्छिकता होनी चाहिए।
  • 255 तक के वज़न के लिए वितरण 1% के भीतर होना चाहिए
    • 16-बिट RNG उपरोक्त दोनों आवश्यकताओं को पूरा करने के लिए पर्याप्त हैं। अधिकांश बिल्ट-इन RNG पर्याप्त हैं।
  • आप वर्तमान वितरण में तब तक पास हो सकते हैं जब तक कि वितरण या तो कॉल द्वारा म्यूट कर दिया जाता है या पोस्ट-रोल वितरण डाई रोल के साथ वापस कर दिया जाता है। वितरण / गणना को अद्यतन करना इस चुनौती का एक हिस्सा है
  • आप वेट के बजाय वेट का उपयोग कर सकते हैं। ऐसा करते समय, जब भी कोई भार 0 पर गिरता है, तो सभी वज़न को 1 से बढ़ाना चाहिए ताकि स्टोरिंग काउंट के समान प्रभाव प्राप्त हो सके।
    • आप इन भारों का उपयोग किसी सरणी में तत्वों की पुनरावृत्ति के रूप में कर सकते हैं।

सौभाग्य। कभी भी बाइट आपके पक्ष में हो सकती है।


ऐसा प्रतीत होता है कि आप सभी नियमों का पालन कर सकते हैं और रैंडम नंबर n के साथ शुरू करके खामियों को दूर कर सकते हैं, फिर आउटपुटिंग (n ++% 6) कर सकते हैं।
फैक्स

2
@Fax यह समस्या स्पष्ट रूप से बताती है और ठीक उसी प्रकार से जो $ k $ th नंबर का वितरण पहले $ k-1 $ नंबर दिए जाने चाहिए। आपका विचार स्पष्ट रूप से दूसरे नंबर के लिए गलत वितरण को पहला नंबर देता है।
जीके

@JiK मैं असहमत हूं, क्योंकि उस तर्क को किसी अन्य कोड के खिलाफ इस्तेमाल किया जा सकता है जो सही यादृच्छिक के विपरीत PRNG का उपयोग करता है। मेरा प्रस्ताव है कि है एक PRNG, एक बहुत ही साधारण यद्यपि।
फैक्स

@ जिक मान लें कि आप सैद्धांतिक वितरण के बारे में बात कर रहे हैं, अर्थात। सांख्यिकीय महत्व रखने के लिए मापित वितरण $ 1 $ $ के लिए आवश्यक १% के भीतर है।
फैक्स

1
@ आपका बेतरतीब स्रोत कम से कम 65535 की अवधि का नहीं है, इसलिए यह इस समस्या के लिए पर्याप्त PRNG नहीं है। इसके अलावा मुझे समझ में नहीं आता है कि "मापा वितरण" से आपका क्या मतलब है।
जीके

जवाबों:


12

आर , 59 बाइट्स

function(){T[o]<<-T[o<-sample(6,1,,max(T)-T+1)]+1
o}
T=!1:6

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

मायने रखता है T, जो तब weightsतर्क के रूप में इस्तेमाल किया जा करने के लिए बदल जाता है sample(जो तब सबसे अधिक संभावना है कि उन्हें योग करने के लिए सामान्य करता है 1)।

[<<-ऑपरेटर को कोई मान निर्दिष्ट किया जाता है Tमाता पिता के वातावरण (इस मामले में, केवल माता-पिता माहौल है में से एक में .GlobalEnv)।


2
वैश्विक असाइनमेंट का अच्छा उपयोग। किसी भी कारण से आप अपने चर कहते हैं T? (कोड को पढ़ने के लिए कठिन बनाने के अलावा!)
रॉबिन राइडर

@RobinRyder मुझे लगता है कि मेरा मूल विचार फ़ंक्शन का उपयोग Tया Fआंतरिक रूप से करना था, और तब मुझे यह महसूस करने के लिए कि मुझे वैश्विक असाइनमेंट की आवश्यकता है, इसे बदलने के लिए मैं बहुत आलसी था।
ग्यूसेप

3
@ रोबिनरीडर: मुझे आश्चर्य है कि आप वांग-लैंडौ समाधान का
शीआन

1
@ शीआन मैंने एक पर काम करना शुरू कर दिया! लेकिन बाइट की गिनती पैकेज का उपयोग करते समय बहुत अधिक थी pawl
रॉबिन राइडर

6

पायथन 3 , 112 99 बाइट्स

from random import*
def f(C=[0]*6):c=choices(range(6),[1-a+max(C)for a in C])[0];C[c]+=1;print(c+1)

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

व्याख्या

# we only need the "choice" function
from random import*

      # C, the array that holds previous choices, is created once when the function is defined
      # and is persisted afterwards unless the function is called with a replacement (i.e. f(C=[0,1,2,3,4,5]) instead of f() )
      C=[0]*6
# named function
def f(.......):
                  # generate weights
                  [1-a+max(C)for a in C]
# take the first item generated using built-in method
c=choices(range(6),......................)[0]
    # increment the counter for this choice
    C[c]+=1
    # since the array is 0-indexed, increase the number by 1 for printing
    print(c+1)

संपादित करें: 13 बाइट्स सहेजे गए। धन्यवाद, उपस्थित !



@attinat आप टपल अनपैकिंग ( c,=और ड्रॉपिंग [0]) का उपयोग करके 2 बाइट छोड़ सकते हैं । यह भी ध्यान देने योग्य है कि choicesपायथन 3.6+
409_संपादित करें

5

05AB1E , 13 बाइट्स

Z>αāDrÅΓΩ=Q+=

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

इनपुट के रूप में मायने रखता है की सूची लेता है। रोल और नए मायने रखता है।

स्पष्टीकरण:

Z                 # maximum
 >                # plus 1
  α               # absolute difference (vectorizes)
                  # the stack now has the list of weights
ā                 # range(1, length(top of stack)), in this case [1..6]
 D                # duplicate
  r               # reverse the entire stack
   ÅΓ             # run-length decode, using the weights as the run lengths
     Ω            # pick a random element
                  # the stack is now: counts, [1..6], random roll
=                 # output the roll without popping
 Q                # test for equality, vectorizing
  +               # add to the counts
   =              # output the new counts

3

जावास्क्रिप्ट (ईएस 8), 111 बाइट्स

_=>++C[C.map((v,i)=>s+=''.padEnd(Math.max(...C)-v+1,i),s=''),n=s[Math.random()*s.length|0]]&&++n;[,...C]=1e6+''

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

कैसे?

यह एक बल्कि भोला और सबसे अधिक संभवतया उप-अपनाने वाला कार्यान्वयन है जो वर्णन के अनुसार अनुकरण करता है।

सीरोंमैंमीटरएक्स(सी)-सीमैं+1


3

एपीएल (Dyalog यूनिकोड) , 32 बाइट्स SBCS

-4 बाइट्स अंतराल सूचकांक के बजाय प्रतिकृति का उपयोग करते हैं।

{1∘+@(⎕←(?∘≢⌷⊢)(1+⍵-⍨⌈/⍵)/⍳6)⊢⍵}

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

एक फ़ंक्शन के रूप में परिभाषित किया गया है जो वर्तमान वितरण को एक तर्क के रूप में लेता है, परिणामी मर रोल को प्रिंट करता है, और अद्यतन वितरण को वापस करता है। TIO पर पहला रन 100 इनवोकेशन के साथ शुरू होता है [0,0,0,0,0,0], दूसरा रन 1 के प्रति भारी पक्षपाती होता है [0,100,100,100,100,100], और अंतिम रन एक ही तरीके से 6 के लिए भारी पक्षपाती होता है।


3

पर्ल 6 , 31 बाइट्स

{--.{$/=.pick}||++«.{1..6};$/}

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

बैगहैश के रूप में वर्तमान वजन वितरण को स्वीकार करता है, जहां से शुरू होता है सभी वजन 1. वितरण वितरण में जगह है।

BagHash pickविधि यादृच्छिक रूप से संबंधित भार का उपयोग करके एक कुंजी का चयन करती है; उस कुंजी का वजन तब एक-एक करके घटाया जाता है। यदि उस भार को शून्य बना दिया जाता है, तो ++«.{1..6}सभी संख्याओं के भार को बढ़ाते हैं 1-6।



2

जावास्क्रिप्ट (ES6 +), 97 बाइट्स

d=[1,2,3,4,5,6]
w=[...d]
r=x=>(i=~~(Math.random()*w.length),k=w[i],w.concat(d.filter(x=>x!=k)),k)

व्याख्या

d=[1,2,3,4,5,6]                   // basic die
w=[...d]                          // weighted die
r=x=>(                            // x is meaningless, just saves 1 byte vs ()
  i=~~(Math.random()*w.length),   // pick a random face of w
  k=w[i],                         // get the value of that face
  w.concat(d.filter(x=>x!=k)),    // add the faces of the basic die that aren't the value
                                  // we just picked to the weighted die
  k                               // return the value we picked
)

ध्यान दें कि यह अंततः ऊपर उड़ जाएगा अगर w2 32 -1 की लंबाई से अधिक है , जो कि js में अधिकतम सरणी लंबाई है, लेकिन आप शायद 32-बिट इंट सरणी 2 32 -1 लंबे पर विचार करते हुए, इससे पहले एक मेमोरी सीमा से टकराएंगे। 16GiB, और कुछ (अधिकांश?) ब्राउज़र आपको 4GiB से अधिक उपयोग नहीं करने देंगे।


2

पर्ल 6 , 49 बाइट्स

{($!=roll (1..6 X=>1+max 0,|.{*})∖$_:),$_$!}

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

एक बैग (मल्टीसेट) के रूप में पिछले रोल लेता है। नया रोल और नया वितरण लौटाता है।

व्याख्या

{                                            }  # Anon block taking
                                                # distribution in $_
                     max 0,|.{*}  # Maximum count
                   1+             # plus one
           1..6 X=>  # Pair with numbers 1-6
          (                     )∖$_  # Baggy subtract previous counts
     roll                            :  # Pick random element from Bag
 ($!=                                 )  # Store in $! and return
                                       ,$_$!  # Return dist with new roll

1

पायथ , 22 20 बाइट्स

Xt
hOs.e*]kh-eSQbQQ1

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

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

Xt¶hOs.e*]kh-eSQbQQ1   Implicit: Q=eval(input())
                       Newline replaced with ¶
      .e         Q     Map elements of Q, as b with index k, using:
             eSQ         Max element of Q (end of sorted Q)
            -   b        Subtract b from the above
           h             Increment
        *]k              Repeat k the above number of times
                       Result of the above is nested weighted list
                       e.g. [1,0,3,2,1,0] -> [[0, 0, 0], [1, 1, 1, 1], [2], [3, 3], [4, 4, 4], [5, 5, 5, 5]]
     s                 Flatten
    O                  Choose random element
   h                   Increment
  ¶                    Output with newline
 t                     Decrement
X                 Q1   In Q, add 1 to the element with the above index
                       Implicit print

1

जेली , 12 बाइट्स

’ạṀJx$X,Ṭ+¥¥

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

एक मौद्रिक लिंक जो एकल तर्क लेता है, वर्तमान गणना सूची, और चुनी हुई संख्या और अद्यतन गणना सूची की एक सूची देता है।

जेली , 18 बाइट्स

0x6+ɼṀ_®‘Jx$XṬ+ɼṛƊ

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

एक विकल्प के रूप में, यहाँ एक निलेडिक लिंक दिया गया है जो चुने गए नंबर को लौटाता है और रजिस्टर में गिनती सूची का ट्रैक रखता है।

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