일반적인 생일 문제


12

오늘 밤, 약혼자는 내 생일을 축하하기 위해 저녁을 먹으러 나갔습니다. 우리가 외출하는 동안 나는 생일 축하 행사가 50 명으로 구성된 식당에서 5 명의 다른 손님 (나 자신을 포함하여)에게 노래하는 것을 들었다 . 원래의 생일 문제 (사람의 방에있는 두 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선택한 언어로 표현할 수있는 가장 큰 정수보다 클 수 없습니다. 선택한 언어 (따로 메모리 제약에서) 정수에 더 열심히 최대가없는 경우, 다음 Nk임의의 큰 수 있습니다.
  • 부동 소수점 부정확성으로 인한 정확도 오류는 무시할 수 있습니다. 솔루션은 완벽하고 정확한 무한 정밀도 부동을 가정해야합니다.

테스트 사례

체재: 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
생일 축하해 (늦게)!
Luis Mendo 2016 년

작은 숫자에 대해 몇 가지 테스트 사례를 추가 할 수 있습니까?
Luis Mendo 2016 년

@LuisMendo 나는 몇 시간의 수면을 취한 후에 더 추가 할 것입니다 :)
Mego

6
사람들이 식당에서 음식을 먹을 확률은 생일 여부와 무관 할 것이므로 50 명 중 5 명은 생일 문제 논리가 제시하는 것보다 높을 가능성이 높습니다.
Glen O

@GlenO 좋은 지적!
Luis Mendo 2016 년

답변:


3

젤리 , 17 16 바이트

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

매우 비효율적입니다. 온라인으로 사용해보십시오! (하지만 N을 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 이하로 유지"... 지나치게 제한적이지 않습니까?
Neil

2
@Neil이 솔루션은 모든 입력에 유효하지만 온라인 인터프리터는 메모리 및 시간 제약으로 인해 N> 3 인 입력을 실행할 수 없습니다.
Mego

@Mego 난 그냥 당신이하지 않은 경우가 훨씬 이해가되지 않기 때문에 생각하고 k > 1, 다음 주어진 k <= N당신이 다음 유지하려는 경우, N < 3의 값에 대한 선택의 여지를 남겨 두지 않습니다 Nk당신이 시도 할 수있다.
Neil

4

MATL , 16 바이트

365:Z^!tXM=s>~Ym

첫 번째 입력은 N이고 두 번째 입력은 입니다 k.

온라인으로 사용해보십시오!

이것은 Dennis 'Jelly answer 와 같은 열거 기반 접근 방식 이므로 메모리 제한으로 인해 입력 수를 작게 유지해야합니다.

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
Luis Mendo

2
글쎄, 나는 일어났다. 그러나 내가 관리했던 최고는 동점이었다. 젤리는 정말로 평균 원자가 필요합니다 ...
Dennis

@ 데니스 나는 같은 생각을하고있었습니다. 아마도 모드 원자?
Luis Mendo 2016 년

0

J, 41 36 바이트

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

다른 방법과 유사한 간단한 접근 방식. n> 3 에서 메모리 문제가 발생 합니다.

용법

kLHS와 nRHS에 가치를 부여 합니다 .

   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

내 PC에서 i7-4770k 및 타이머 foreign을 사용하면 n = 3 에 대한 6!:2컴퓨팅 에는 약 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.