Bài toán sinh nhật tổng quát


12

Tối nay, chồng sắp cưới đưa tôi đi ăn tối để chúc mừng sinh nhật. Khi chúng tôi ra ngoài, tôi nghe thấy Chúc mừng sinh nhật hát cho 5 vị khách khác nhau (bao gồm cả bản thân tôi), trong một nhà hàng có 50 người. Điều này khiến tôi băn khoăn - vấn đề sinh nhật ban đầu (tìm xác suất 2 người trong một phòng có Nchung ngày sinh nhật) rất đơn giản và dễ hiểu. Nhưng những gì về tính toán xác suất mà ít nhất kmọi người trong số Nnhững người chia sẻ cùng một ngày sinh nhật?

Trong trường hợp bạn đang tự hỏi, xác suất có ít nhất 5 người trong tổng số 50 người có cùng ngày sinh là khoảng 1/10000.

Các thách thức

Cho hai số nguyên Nk, ở đó N >= k > 0, đưa ra xác suất rằng ít nhất kmọi người trong một nhóm Nngười có cùng ngày sinh. Để đơn giản, hãy giả sử rằng luôn có 365 ngày sinh có thể và tất cả các ngày đều có khả năng như nhau.

Đối với k = 2, này nắm đến vấn đề sinh nhật ban đầu, và xác suất là 1 - P(365, N)/(365)**N(nơi P(n,k)số lượng hoán vị k-chiều dài hình thành từ n phần tử ). Đối với các giá trị lớn hơn k, bài viết Wolfram MathWorld này có thể hữu ích.

Quy tắc

  • Đầu ra phải có tính quyết định và càng chính xác càng tốt cho ngôn ngữ bạn đã chọn. Điều này có nghĩa là không có ước tính Monte Carlo hoặc xấp xỉ Poisson.
  • Nksẽ không lớn hơn số nguyên có thể biểu thị lớn nhất trong ngôn ngữ bạn đã chọn. Nếu ngôn ngữ bạn chọn không có tối đa cứng đối với số nguyên (ngoài các ràng buộc về bộ nhớ), thì Nk có thể lớn tùy ý.
  • Các lỗi chính xác xuất phát từ sự thiếu chính xác của dấu phẩy động có thể bị bỏ qua - giải pháp của bạn sẽ giả sử các số float chính xác hoàn toàn, chính xác vô hạn.

Các trường hợp thử nghiệm

Định dạng: 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
Chúc mừng sinh nhật (muộn màng)!
Luis Mendo

Có thể thêm một vài trường hợp thử nghiệm cho số lượng nhỏ?
Luis Mendo

@LuisMendo Tôi sẽ thêm một số nữa sau khi tôi ngủ được vài giờ :)
Mego

6
Điều đáng chú ý là xác suất mọi người ăn ở nhà hàng có lẽ không độc lập với việc đó có phải là sinh nhật của họ hay không, vì vậy xác suất năm ngày sinh trong số 50 người có lẽ cao hơn logic của Vấn đề sinh nhật.
Glen O

@GlenO Điểm tốt!
Luis Mendo

Câu trả lời:


3

Thạch , 17 16 byte

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

Vô cùng kém hiệu quả. Hãy thử trực tuyến! (nhưng giữ N dưới 3 )

Làm thế nào nó hoạt động

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
"Giữ N dưới 3" ... không phải là quá hạn chế sao?
Neil

2
@Neil Giải pháp hợp lệ cho tất cả các đầu vào, nhưng trình thông dịch trực tuyến sẽ không thể chạy các đầu vào trong đó N> 3, do hạn chế về bộ nhớ và thời gian.
Mego

@Mego Tôi chỉ nghĩ rằng bởi vì nó không có ý nghĩa gì nếu bạn không có k > 1, sau đó được đưa ra k <= N, nếu bạn muốn giữ N < 3, điều đó không để lại nhiều sự lựa chọn cho các giá trị Nkbạn có thể thử.
Neil

4

MATL , 16 byte

365:Z^!tXM=s>~Ym

Đầu vào là N, thứ hai là k.

Hãy thử trực tuyến!

Đây là một cách tiếp cận dựa trên liệt kê, như câu trả lời của Dennis 'Jelly , vì vậy số lượng đầu vào nên được giữ ở mức nhỏ do giới hạn bộ nhớ.

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
Bạn đã vượt qua Dennis, công việc tốt.
m654

4
@ m654 Hãy xem khi anh ấy thức dậy :-D
Luis Mendo

2
Chà, tôi thức dậy, nhưng điều tốt nhất tôi quản lý là cà vạt. Jelly thực sự cần một nguyên tử trung bình ...
Dennis

@Dennis Tôi cũng nghĩ như vậy. Có lẽ một nguyên tử chế độ quá?
Luis Mendo

0

J, 41 36 byte

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

Cách tiếp cận thẳng về phía trước tương tự như những người khác. Chạy vào các vấn đề bộ nhớ ở n> 3 .

Sử dụng

Lấy giá trị của kLHS và ntrê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

Trên máy tính của tôi, sử dụng i7-4770k và bộ đếm thời gian nước ngoài 6!:2, tính toán cho n = 3 cần khoảng 25 giây.

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

Giải trình

(+/%#)@(<: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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.