Ce soir, ma fiancée m'a emmené dîner pour fêter mon anniversaire. Pendant notre absence, j'ai entendu Happy Birthday chanté devant 5 invités différents (moi y compris), dans un restaurant de 50 personnes. Cela m'a fait me demander - le problème d'anniversaire d'origine (trouver la probabilité que 2 personnes dans une pièce de N
personnes partagent le même anniversaire) est très simple et direct. Mais qu'en est-il du calcul de la probabilité qu'au moins des k
personnes sur des N
personnes partagent le même anniversaire?
Au cas où vous vous poseriez la question, la probabilité qu'au moins 5 personnes sur 50 au total partagent le même anniversaire est d'environ 1/10000.
Le défi
Étant donné deux nombres entiers N
et k
, où N >= k > 0
, produire la probabilité qu'au moins les k
personnes d'un groupe de N
personnes partagent le même anniversaire. Pour simplifier les choses, supposons qu'il y a toujours 365 anniversaires possibles et que tous les jours sont également probables.
Pour k = 2
, cela se résume au problème d'anniversaire d'origine, et la probabilité est 1 - P(365, N)/(365)**N
(où P(n,k)
est le nombre de permutations de longueur k formées de n éléments ). Pour des valeurs plus grandes de k
, cet article de Wolfram MathWorld peut s'avérer utile.
Règles
- La sortie doit être déterministe et aussi précise que possible pour la langue choisie. Cela signifie aucune estimation de Monte Carlo ou approximation de Poisson.
N
etk
ne sera pas plus grand que le plus grand entier représentable dans la langue choisie. Si votre langue choisie n'a pas de maximum dur sur les entiers (à part les contraintes de mémoire), alorsN
ellek
peut être arbitrairement grande.- Les erreurs de précision résultant d'inexactitudes en virgule flottante peuvent être ignorées - votre solution doit supposer des flottants parfaitement précis et de précision infinie.
Cas de test
Format: 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)
Réponses:
Gelée ,
1716 octetsExtrêmement inefficace. Essayez-le en ligne! (mais gardez N en dessous de 3 )
Comment ça fonctionne
la source
k > 1
, alors donnék <= N
, si vous voulez ensuite garderN < 3
, cela ne laisse pas beaucoup de choix pour les valeurs deN
etk
que vous pouvez essayer.MATL , 16 octets
La première entrée est
N
, la seconde estk
.Essayez-le en ligne!
Il s'agit d'une approche basée sur l'énumération, comme la réponse Jelly de Dennis , donc les nombres d'entrée doivent être réduits en raison des limitations de mémoire.
la source
J,
4136 octetsApproche simple similaire aux autres. Exécute des problèmes de mémoire à n> 3 .
Usage
Prend la valeur de
k
sur le LHS etn
sur le RHS.Sur mon PC, en utilisant un i7-4770k et le minuteur étranger
6!:2
, le calcul pour n = 3 nécessite environ 25 secondes.Explication
la source