मौका क्या है कि मैं एक दरवाजा पुरस्कार जीतूंगा?


12

मेरा स्थानीय एसीएम अध्याय बैठकों में आने वाले लोगों को डोर पुरस्कार प्रदान करता है। यदि आप प्रोग्रामिंग पहेली को हल करते हैं, तो आपको जीतने का एक बढ़ा मौका मिलता है, हालांकि (लेकिन मैं हमेशा उस पहेली को हल करता हूं )। इस प्रकार, कुछ लोगों के पास 1 प्रविष्टि है, जबकि अन्य में 2 हैं। लेकिन रुको! जिस तरह से रफ़ल प्रोग्राम काम करता है वह किसी और प्रविष्टि में जोड़कर नहीं होता है जब कोई पहेली हल करता है। इसके बजाय, यह उस व्यक्ति के "जीवन" की संख्या पर नज़र रखता है, जो यह बताता है कि यदि उस व्यक्ति को उसके प्रत्येक रैंडम सैंपलिंग एल्गोरिथम में चुना गया है। तो यह इस तरह काम करता है:

Doorknob: 1.  xnor: 2.  Justin: 2.  Alex: 1.  Dennis: 2.

फिर कार्यक्रम बेतरतीब ढंग से एक का चयन करता है [Doorknob, xnor, Justin, Alex, Dennis], संख्या को घटाता है (कहो कि यह चुनता है Justin):

Doorknob: 1.  xnor: 2.  Justin: 1.  Alex: 1. Dennis: 2.

और दोहराता है। यदि किसी के "जीवन" की संख्या 0( Justinफिर से चुनने के लिए ) जाती है, तो उन्हें सूची से निकाल दिया जाता है:

Doorknob: 1.  xnor: 2.  Alex: 1.  Dennis: 2.

यह तब तक जारी रहता है जब तक कि एक व्यक्ति शेष न हो; वह व्यक्ति विजेता है।

अब असली सवाल यह है कि मेरे जीतने की संभावना क्या थी?


आपको दो इनपुट दिए जाएंगे:

  • n। यह चुनौती में प्रवेश करने वाले लोगों की संख्या है
  • k। यह उन लोगों की संख्या है (जिनके n) 2 जीवन हैं। इस नंबर में हमेशा आप शामिल होते हैं।

इसलिए अगर मेरे पास कोई फ़ंक्शन था pऔर कहा जाता है p(10, 5), तो यह पुरस्कार जीतने की संभावना होगी जहां कुल 10 लोग हैं, जिनमें से 5 के पास केवल 1 जीवन है, जबकि 5 (आपके सहित) में 2 जीवन हैं।


आपसे अपेक्षा की जाती है कि आप जीतने की संभावना को बिल्कुल या एक दशमलव के रूप में आउटपुट करें। किसी भी दर पर, उत्तर दशमलव बिंदु के बाद 4 वें दशमलव स्थान तक सही और समाहित होना चाहिए । आप उस अंक के लिए राउंड करते हैं या नहीं, यह आपके ऊपर है।

आपका समाधान एक यादृच्छिक समाधान हो सकता है जो उच्च संभावना के साथ 4 वें दशमलव स्थान पर उत्तर को आउटपुट करता है । आप मान सकते हैं कि आपके द्वारा उपयोग किया गया आरएनजी में निर्मित वास्तव में यादृच्छिक है, और इसे कम से कम 90% संभावना के साथ सही उत्तर का उत्पादन करना चाहिए।

इसके अलावा, आपके कोड को केवल काम करने की आवश्यकता है n, k <= 1000, हालांकि मैंने उन उत्सुक लोगों के लिए परीक्षण मामलों को इससे बड़ा प्रदान किया।


परीक्षण के मामलों

नोट: इनमें से कुछ सामान्य सूत्र हैं।

n,    k   |  output
----------+---------
1,    1   |  1
2,    2   |  0.5
2,    1   |  0.75
3,    1   |  11/18 = 0.611111111
1000, 1   |  0.007485470860550352
4,    3   |  0.3052662037037037
k,    k   |  1/k
n,    1   |  (EulerGamma + PolyGamma[1 + n])/n    (* Mathematica code *)
          |  (γ + ψ(1 + n))/n
10,   6   |  0.14424629234373537
300,  100 |  0.007871966408910648
500,  200 |  0.004218184180294532
1000, 500 |  0.0018008560286627948
---------------------------------- Extra (not needed to be a valid answer)
5000, 601 |  0.0009518052922680399
5000, 901 |  0.0007632938197806958

कुछ अन्य जाँचों के लिए, p(n, 1) * nइस प्रकार हैं:

n     |  output
------+---------
1     | 1
2     | 1.5 
3     | 1.8333333333333335
10    | 2.928968253968254
100   | 5.1873775176396215
-------------------------- Extra (not needed to be a valid answer)
100000| 12.090146129863305

मैं अब इस साइट के टैग से परिचित नहीं हूँ; यदि आप अधिक उपयुक्त टैग के बारे में सोचते हैं, तो कृपया दूर संपादित करें!
जस्टिन

Math.se पर निकटतम संबंधित प्रश्न: math.stackexchange.com/q/1669715/72616
जस्टिन

तो, P (n, k) = (((k-1) / n) P (n, k-1) + ((nk) / n) P (n-1, k) + (1 / n) Q ( n, k-1), जहां Q (n, k) = ((nk-1) / n) Q (n-1, k) + (k / n) Q (n, k-1) और Q (1) , 0) = 1 ...
लीके नून

@ केनीलाऊ मैं इसकी व्याख्या करने का प्रयास नहीं करने जा रहा हूं, लेकिन math.se लिंक से सावधान रहना चाहिए, क्योंकि यह फ़ंक्शन की थोड़ी अलग परिभाषा का उपयोग करता है (मुझे विश्वास kहै कि यह एक से दूर है)
जस्टिन

2
क्या पर्याप्त परीक्षण के साथ एक यादृच्छिक सिमुलेशन करना ठीक है कि उत्तर उच्च संभावना के साथ चौथे दशमलव स्थान पर सही है, हालांकि निश्चित रूप से निश्चित नहीं है?
xnor

जवाबों:


2

MATL , 42 बाइट्स

:<~QXJx`J`tf1Zry0*1b(-tzq]f1=vts3e8<]6L)Ym

यह एक संभाव्य (मोंटे कार्लो) दृष्टिकोण का उपयोग करता है। प्रयोग बड़ी संख्या में चलाया जाता है, जिसमें से संभावना का अनुमान लगाया जाता है। यह सुनिश्चित करने के लिए कि कम से कम 90% के साथ चौथे दशमलव तक सही है, यह सुनिश्चित करने के लिए वास्तविकताओं की संख्या का चयन किया जाता है। हालाँकि, इसमें बहुत लंबा समय और बहुत सारी मेमोरी लगती है। लिंक में नीचे दी गई वास्तविकताओं की संख्या 10 6 के एक कारक से कम कर दी गई है ताकि कार्यक्रम समय के उचित समय में समाप्त हो जाए; और केवल पहले दशमलव को कम से कम 90% संभावना के साथ सटीक होने की गारंटी है।

EDIT (29 जुलाई, 2016): भाषा में बदलाव के कारण, इसे बदलने की 6Lआवश्यकता है 3L। नीचे दिए गए लिंक में उस संशोधन को शामिल किया गया है।

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

पृष्ठभूमि

आज्ञा देना निरूपित होने के लिए p को निरूपित करें। चुनौती में वर्णित प्रयोग को कई बार n के लिए चलाया जाएगा । हर बार, या तो आप पुरस्कार जीतते हैं (" सफलता ") या आप नहीं। आज्ञा देना N सफलताओं की संख्या है। वांछित संभावना जा सकती है, अनुमान से एन और एन । जितना बड़ा n होगा, अनुमान उतना ही सटीक होगा। मुख्य प्रश्न यह है कि वांछित सटीकता को पूरा करने के लिए n का चयन कैसे करें , अर्थात्, यह आश्वस्त करने के लिए कि त्रुटि का कम से कम 90% समय 10 .4 से कम होगा ।

मोंटे कार्लो के तरीके हो सकते हैं

  • निश्चित-आकार : n का मान पहले से तय है (और फिर N यादृच्छिक है);
  • चर-आकार : n अनुकार परिणामों द्वारा मक्खी पर निर्धारित किया जाता है।

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

विशेष रूप से, नकारात्मक-द्विपद मोंटे कार्लो के साथ x = ( N /1) / ( n )1) p का निष्पक्ष अनुमानक है ; और संभावना है कि x किसी दिए गए अनुपात से अधिक पी से विचलन करता है, ऊपरी-बाध्य हो सकता है। इस पत्र में समीकरण (1) के अनुसार ( यह भी ध्यान दें कि स्थितियां (2) संतुष्ट हैं), N = 2.75 · 10 8 या बड़ा लेना यह सुनिश्चित करता है कि p / x अंतराल से संबंधित है [1.0001, 0.9999] कम से कम 90% के साथ संभावना। विशेष रूप से, इसका तात्पर्य यह है कि x वांछित के रूप में कम से कम 90% संभावना के साथ 4 वें दशमलव स्थान तक सही है।

कोड समझाया गया

एक बाइट को बचाने के लिए कोड N = का उपयोग करता है 3e8। ध्यान दें कि ऐसा करने से कई सिमुलेशन को लंबा समय लगेगा। लिंक में कोड N = का उपयोग करता है 300, जो अधिक उचित मात्रा में चलता है (पहले परीक्षण मामलों के लिए ऑनलाइन संकलक में 1 मिनट से भी कम); लेकिन यह केवल आश्वासन देता है कि कम से कम 90% संभावना के साथ पहला दशमलव सही है।

:        % Take k implicitly. Range [1 ... k]
<~       % Take n implicitly. Determine if each element in the previous array is
         % less than or equal than n
Q        % Add 1. This gives an array [2 ... 2 1 ... 1]
XJx      % Copy to clipboard J. Delete from stack
`        % Do...while. Each iteration is a Monte Carlo realization, until the 
         % desired nunber of successes is reached
  J      %   Push previously computed array [2 ... 2 1 ... 1]
  `      %   Do...while. Each iteration picks one door and decrements it, until
         %   there is only one
    t    %     Duplicate
    f    %     Indices of non-zero elements of array
    1Zr  %     Choose one of them randomly with uniform distribution
    y0*  %     Copy of array with all values set to 0
    1b(  %     Assign 1 to chosen index
    -    %     Subtract
    tzq  %     Duplicate. Number of nonzero elements minus 1. This is falsy if
         %     there was only one nonzero value; in this case the loop is exited
  ]      %   End do...while
  f1=    %   Index of chosen door. True if it was 1 (success), 0 otherwise
  v      %   Concatenate vertically to results from previous realizations
  ts3e8< %   Duplicate. Is the sum less than 3e8? If so, the loop is exited
]        % End do...while
6L)      % Remove last value (which is always 1)
Ym       % Compute mean. This gives (N-1)/(n-1). Implicitly display

हाहा मुझे एहसास नहीं था कि 90% इसे मुश्किल बना देगा :-)
जस्टिन

हां, 90% आत्मविश्वास के साथ चौथा दशमलव एक बहुत मजबूत आवश्यकता है :-)
लुइस मेंडो

2

पायथ, 34 बाइट्स

Mc|!*HJ-GHch*J+*tHgGtH*gtGHKh-GHKG

परीक्षण सूट

एक नियतात्मक ज्ञापन पुनरावर्ती कार्य को परिभाषित करता है जो n , k को तर्क के रूप में gलेता है। लगभग 18 सेकंड में रिटर्न (उपरोक्त परीक्षण सूट में शामिल नहीं है क्योंकि यह ऑनलाइन दुभाषिया से बाहर है)।g 1000 5000.0018008560286627952

एक अनुमानित पायथन 3 अनुवाद होगा

@memoized
def g(n,k):
    return (not k*(n-k) or (1+(n-k)*((k-1)*g(n,k-1)+g(n-1,k)*(n-k+1)))/(n-k+1))/n

1

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

f=(n,k,d=n-k)=>(!d||(f(n-1,k)*++d*--d+1+(--k&&f(n,k)*k*d))/++d)/n

हालांकि बड़ी संख्या के साथ यह कोशिश मत करो; यहां तक ​​कि एफ (30, 10) समय की एक उल्लेखनीय राशि लेता है।

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