सामान्यीकृत जन्मदिन की समस्या


12

आज रात, मेरे मंगेतर ने मुझे अपना जन्मदिन मनाने के लिए डिनर पर ले गए। जब हम बाहर थे, मैंने 50 लोगों से भरे एक रेस्तरां में 5 अलग-अलग मेहमानों (खुद सहित) के लिए गाया हैप्पी बर्थडे सुना । यह मुझे आश्चर्यचकित कर गया - मूल जन्मदिन की समस्या (संभावना है कि एक कमरे में 2 लोग एक Nही जन्मदिन साझा करते हैं) बहुत सरल और सीधा है। लेकिन इस संभावना की गणना के बारे में क्या है कि कम से कम kलोगों में से Nएक ही जन्मदिन साझा करें?

यदि आप सोच रहे हैं, तो एक ही जन्मदिन को साझा करने वाले कुल 50 लोगों में से कम से कम 5 लोगों की संभावना लगभग 1/10000 है।

चुनौती

दो पूर्णांकों को देखते हुए Nऔर k, जहां N >= k > 0, उत्पादन संभावना कम से कम है कि kके एक समूह में लोगों को Nलोगों को एक ही जन्मदिन का हिस्सा। चीजों को सरल रखने के लिए, मान लें कि हमेशा 365 संभावित जन्मदिन हैं, और सभी दिन समान रूप से होने की संभावना है।

के लिए k = 2, इस मूल जन्मदिन समस्या करने पर निर्भर करता है, और संभावना है 1 - P(365, N)/(365)**N(जहां P(n,k)है n तत्वों से बनाई k-लंबाई क्रमपरिवर्तन की संख्या )। के बड़े मूल्यों के लिए k, यह वुल्फ्राम मैथवर्ल्ड लेख उपयोगी साबित हो सकता है।

नियम

  • आउटपुट निर्धारक होना चाहिए, और आपकी चुनी हुई भाषा के लिए यथासंभव सटीक होना चाहिए। इसका मतलब कोई मोंटे कार्लो अनुमान या पॉइसन अनुमान नहीं है।
  • Nऔर kआपकी चुनी हुई भाषा में सबसे बड़े प्रतिनिधित्व योग्य पूर्णांक से बड़ा नहीं होगा। यदि आपकी चुनी हुई भाषा में पूर्णांक (मेमोरी की बाधाओं से अलग) पर कोई कठिन अधिकतम नहीं है, तो हो सकता है Nऔर kमनमाने ढंग से बड़ा हो।
  • फ़्लोटिंग-पॉइंट अशुद्धियों से उपजी सटीकता त्रुटियों को अनदेखा किया जा सकता है - आपके समाधान को पूरी तरह से सटीक, अनंत-सटीक फ़्लोट्स मान लेना चाहिए।

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

प्रारूप: k, N -> exact fraction (float approximation)

2, 4 -> 795341/48627125 (0.016355912466550306)
2, 10 -> 2689423743942044098153/22996713557917153515625 (0.11694817771107766)
2, 23 -> 38093904702297390785243708291056390518886454060947061/75091883268515350125426207425223147563269805908203125 (0.5072972343239854)
3, 3 -> 1/133225 (7.5060987051979735e-06)
3, 15 -> 99202120236895898424238531990273/29796146005797507000413918212890625 (0.0033293607910766013)
3, 23 -> 4770369978858741874704938828021312421544898229270601/375459416342576750627131037126115737816349029541015625 (0.01270542106874784)
3, 88 -> 121972658600365952270507870814168157581992420315979376776734831989281511796047744560525362056937843069780281314799508374037334481686749665057776557164805212647907376598926392555810192414444095707428833039241/238663638085694198987526661236008945231785263891283516149752738222327030518604865144748956653519802030443538582564040039437134064787503711547079611163210009542953054552383296282869196147657930850982666015625 (0.5110651106247305)
4, 5 -> 1821/17748900625 (1.0259790386313012e-07)
4, 25 -> 2485259613640935164402771922618780423376797142403469821/10004116148447957520459906484225353834116619892120361328125 (0.0002484237064787077)
5, 50 -> 786993779912104445948839077141385547220875807924661029087862889286553262259306606691973696493529913926889614561937/7306010813549515310358093277059651246342214174497508156711617142094873581852472030624097938198246993124485015869140625 (0.00010771867165219201)
10, 11 -> 801/8393800448639761033203125 (9.542757239717371e-23)
10, 20 -> 7563066516919731020375145315161/4825745614492126958810682272575693836212158203125 (1.5672327389589693e-18)
10, 100 -> 122483733913713880468912433840827432571103991156207938550769934255186675421169322116627610793923974214844245486313555179552213623490113886544747626665059355613885669915058701717890707367972476863138223808168550175885417452745887418265215709/1018100624231385241853189999481940942382873878399046008966742039665259133127558338726075853312698838815389196105495212915667272376736512436519973194623721779480597820765897548554160854805712082157001360774761962446621765820964355953037738800048828125 (1.2030611807765361e-10)
10, 200 -> 46037609834855282194444796809612644889409465037669687935667461523743071657580101605348193810323944369492022110911489191609021322290505098856358912879677731966113966723477854912238177976801306968267513131490721538703324306724303400725590188016199359187262098021797557231190080930654308244474302621083905460764730976861073112110503993354926967673128790398832479866320227003479651999296010679699346931041199162583292649095888379961533947862695990956213767291953359129132526574405705744727693754517/378333041587022747413582050553902956219347236460887942751654696440740074897712544982385679244606727641966213694207954095750881417642309033313110718881314425431789802709136766451022222829015561216923212248085160525409958950556460005591372098706995468877542448525403291516015085653857006548005361106043070914396018461580475651719152455730181412523297836008507156692430467118523245584181582255037664477857149762078637248959905010608686740872875726844702607085395469621591502118462813086807727813720703125 (1.21685406174776e-07)

9
विलम्बित जन्मदिन की शुभकामनाएं)!
लुइस मेंडो

शायद छोटी संख्या के लिए कुछ परीक्षण मामलों को जोड़ दें?
लुइस मेंडो

@LuisMendo मैं कुछ घंटों के बाद और कुछ जोड़ूंगा, नींद आने के कुछ समय :)
Mego

6
यह ध्यान देने योग्य है कि एक रेस्तरां में लोग खाने की संभावना शायद इस बात से स्वतंत्र नहीं है कि क्या यह उनका जन्मदिन है, इसलिए 50 लोगों में से पांच जन्मदिन की संभावना संभवतः जन्मदिन की समस्या तर्क से अधिक होगी।
ग्लेन ओ

@GlenO अच्छी बात है!
लुइस मेंडो

जवाबों:


3

जेली , 17 16 बाइट्स

ĠZL
365ṗÇ€<¬µS÷L

अत्यंत अकुशल। इसे ऑनलाइन आज़माएं! (लेकिन एन 3 से नीचे रखें )

यह काम किस प्रकार करता है

365ṗÇ€<¬µS÷L  Main link. Left argument: N. Right argument: K

365ṗ          Cartesian product; generate all lists of length N that consist of
              elements of [1, ..., 365].
    ǀ        Map the helper link over all generated lists. It returns the highest
              amount of people that share a single birthday.
      <       Compare each result with K.
       ¬      Negate.
        µS÷L  Take the mean by dividing the sum by the length.


ĠZL           Helper link. Argument: A (list of integers)

Ġ             Group the indices have identical values in A.
 Z            Zip; transpose rows with columns.
  L           Take the length of the result, thus counting columns.

1
"N को 3 से नीचे रखें" ... क्या यह अत्यधिक प्रतिबंधात्मक नहीं है?
नील

2
@ नील समाधान सभी इनपुटों के लिए मान्य है, लेकिन ऑनलाइन दुभाषिया उन इनपुट्स को चलाने में सक्षम नहीं होगा जहां एन> 3, मेमोरी और समय की कमी के कारण।
Mego

@ मैं यह सोच रहा था कि क्योंकि इसका कोई मतलब नहीं है अगर आपके पास नहीं है k > 1, तो दिया जाता है k <= N, अगर आप चाहते हैं तो रखना चाहते हैं N < 3, और इसके लिए बहुत विकल्प नहीं छोड़ते हैं Nऔर kआप कोशिश कर सकते हैं।
नील

4

MATL , 16 बाइट्स

365:Z^!tXM=s>~Ym

पहला इनपुट है N, दूसरा है k

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

यह एक ज्ञान-आधारित दृष्टिकोण है, जैसे डेनिस का जेली उत्तर , इसलिए इनपुट सीमाओं को स्मृति सीमाओं के कारण छोटा रखा जाना चाहिए।

365:   % Vector [1 2 ... 365]
Z^     % Take N implicitly. Cartesian power. Gives a 2D array with each
       % "combination" on a row
!      % Transpose
t      % Duplicate
XM     % Mode (most frequent element) of each column
=      % Test for equality, element-wise with broadcast. For each column, gives
       % true for elements equal to that column's mode, false for the rest
s      % Sum of each column. Gives a row vector
>~     % Take k implicitly. True for elements equal or greater than k
Ym     % Mean of each column. Implicitly display

2
आपने डेनिस को अच्छा काम दिया।
m654

4
@ m654 देखते हैं कि वह कब उठता है :-D
लुइस मेंडो

2
खैर, मैं उठा, लेकिन सबसे अच्छा मैं एक टाई था। जेली वास्तव में एक मतलब परमाणु की जरूरत है ...
डेनिस

@ डेनिस मैं भी यही सोच रहा था। हो सकता है कि एक मोड परमाणु भी?
लुइस मेंडो

0

जे, 41 36 बाइट्स

(+/%#)@(<:365&(#~>./@(#/.~)@#:i.@^))

दूसरों के समान सीधे-आगे का दृष्टिकोण। N> 3 पर स्मृति समस्याओं में चलता है

प्रयोग

kLHS nपर और RHS पर मान लेता है ।

   f =: (+/%#)@(<:365&(#~>./@(#/.~)@#:i.@^))
   0 f 0
0
   0 f 1
1
   1 f 1
1
   0 f 2
1
   1 f 2
1
   2 f 2
0.00273973
   0 f 3
1
   1 f 3
1
   2 f 3
0.00820417
   3 f 3
7.5061e_6

मेरे पीसी पर, i7-4770k और टाइमर विदेशी का उपयोग करते हुए 6!:2, n = 3 के लिए कंप्यूटिंग में लगभग 25 सेकंड की आवश्यकता होती है।

   timer =: 6!:2
   timer '2 f 3'
24.7893
   timer '3 f 3'
24.896

व्याख्या

(+/%#)@(<:365&(#~>./@(#/.~)@#:i.@^)) Input: k on LHS, n on RHS
          365&                       The number 365
               #~                    Create n copies of 365
                                 ^   Calculate 365^n
                              i.@    The range [0, 1, ..., 365^n-1]
                            #:       Convert each value in the range to base-n and pad
                                     with zeroes to the right so that each has n digits
                     (#/.~)@         Find the size of each set of identical values
                 >./@                Find the max size of each
        <:                           Test each if greater than or equal to k
(+/%#)@                              Apply to the previous result
 +/                                  Find the sum of the values
    #                                Count the number of values
   %                                 Divide the sum by the count and return
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.