Công thức thả xúc xắc (lực không vũ phu)


14

Trước hết tôi không chắc câu hỏi này nên được đăng ở đâu. Tôi đang hỏi nếu một vấn đề thống kê là NP-Complete và nếu không giải quyết nó theo chương trình. Tôi đang đăng nó ở đây vì vấn đề thống kê là điểm trung tâm.

Tôi đang cố gắng tìm một công thức tốt hơn để giải quyết vấn đề. Vấn đề là: nếu tôi có 4d6 (4 con xúc xắc 6 mặt thông thường) và cuộn tất cả chúng cùng một lúc, loại bỏ một con súc sắc với số thấp nhất (gọi là "thả"), sau đó tổng 3 con còn lại, xác suất của mỗi kết quả có thể là bao nhiêu ? Tôi biết câu trả lời là đây:

Sum (Frequency): Probability
3   (1):         0.0007716049
4   (4):         0.0030864198
5   (10):        0.0077160494
6   (21):        0.0162037037
7   (38):        0.0293209877
8   (62):        0.0478395062
9   (91):        0.0702160494
10  (122):       0.0941358025
11  (148):       0.1141975309
12  (167):       0.1288580247
13  (172):       0.1327160494
14  (160):       0.1234567901
15  (131):       0.1010802469
16  (94):        0.0725308642
17  (54):        0.0416666667
18  (21):        0.0162037037

Trung bình là 12,24 và độ lệch chuẩn là 2,847.

Tôi đã tìm thấy câu trả lời ở trên bằng vũ lực và không biết làm thế nào hoặc nếu có một công thức cho nó. Tôi nghi ngờ vấn đề này là NP-Complete và do đó chỉ có thể được giải quyết bằng vũ lực. Có thể có được tất cả các xác suất của 3d6 (3 con xúc xắc 6 mặt bình thường) sau đó xiên từng cái lên trên. Điều này sẽ nhanh hơn sức mạnh vũ phu bởi vì tôi có một công thức nhanh khi tất cả súc sắc được giữ.

Tôi đã lập trình công thức để giữ tất cả súc sắc trong trường đại học. Tôi đã hỏi giáo sư thống kê của tôi về nó và anh ta tìm thấy trang này , sau đó anh ta giải thích cho tôi. Có một sự khác biệt lớn về hiệu suất giữa công thức này và lực lượng vũ phu: 50d6 mất 20 giây nhưng 8d6 giảm các sự cố thấp nhất sau 40 giây (chrome hết bộ nhớ).

Đây có phải là vấn đề NP-Complete? Nếu có, vui lòng cung cấp bằng chứng, nếu không, vui lòng cung cấp công thức không vũ phu để giải quyết nó.

Lưu ý rằng tôi không biết nhiều về NP-Complete vì vậy tôi có thể nghĩ về NP, NP-Hard hoặc một cái gì đó khác. Bằng chứng cho sự hoàn thiện NP là vô ích đối với tôi lý do duy nhất tại sao tôi yêu cầu nó là để ngăn mọi người đoán. Và xin hãy trần trụi với tôi vì đã lâu rồi tôi mới làm việc này: Tôi không nhớ số liệu thống kê cũng như tôi có thể cần phải giải quyết vấn đề này.

Lý tưởng nhất là tôi đang tìm kiếm một công thức chung hơn cho số xúc xắc X với các cạnh Y khi N trong số chúng bị loại bỏ nhưng bắt đầu với một thứ đơn giản hơn nhiều.

Biên tập:

Tôi cũng thích công thức cho tần số đầu ra nhưng chỉ chấp nhận xác suất đầu ra.

Đối với những người quan tâm, tôi đã lập trình câu trả lời của người viết trong JavaScript trên GitHub của tôi (trong cam kết này chỉ có các thử nghiệm thực sự sử dụng các hàm được xác định).


1
Đây là một câu hỏi thú vị. Tôi nghĩ nó nên có chủ đề ở đây. Cám ơn bạn đã xem xét.
gung - Phục hồi Monica

1
Mặc dù cài đặt rất thú vị, nhưng bạn chưa hỏi một câu hỏi có thể trả lời: ý tưởng về tính đầy đủ của NP phụ thuộc vào việc có một lớp vấn đề, trong khi bạn chỉ mô tả một câu hỏi. Chính xác làm thế nào để bạn muốn nó khái quát? Mặc dù bạn gợi ý rằng số lượng xúc xắc có thể khác nhau, nhưng có thể có nhiều tùy chọn bổ sung khác nhau và chúng có thể mang lại những câu trả lời khác nhau: bạn có thể thay đổi số mặt, giá trị trên mặt, số xúc xắc và số xúc xắc bị rơi, tất cả theo nhiều cách khác nhau với các mối quan hệ khác nhau giữa chúng.
whuber

1
@whuber Cô ấy không biết bất kỳ lý thuyết phức tạp nào nhưng tôi nghĩ rõ ràng là cô ấy hỏi về gia đình của các vấn đề được tạo ra bằng cách thay đổi số lượng xúc xắc. Tôi cũng nghĩ rằng tôi có một thuật toán hiệu quả cho nó.
Andy Jones

2
@Andy Tôi thấy cuối cùng cô ấy đang yêu cầu "một công thức chung hơn cho số xúc xắc X với các cạnh Y khi N của chúng bị loại bỏ".
whuber

@whuber Hah! Rõ ràng là không rõ ràng như tôi nghĩ sau đó. Xin lỗi, lỗi của tôi.
Andy Jones

Câu trả lời:


5

Giải pháp

Đặt con xúc xắc mỗi con cho cơ hội bằng nhau cho kết quả 1 , 2 , Lọ , d = 6 . Đặt K là giá trị tối thiểu của các giá trị khi tất cả n xúc xắc được ném độc lập.n=41,2,,d=6Kn

Hãy xem xét sự phân bố của tổng của tất cả giá trị có điều kiện trên K . Gọi X là tổng này. Hàm tạo cho số cách tạo thành bất kỳ giá trị đã cho nào của X , với điều kiện là mức tối thiểu ít nhất là k , lànKXXk

(1)f(n,d,k)(x)=xk+xk+1++xd=xk1xdk+11x.

Do xúc xắc là độc lập, nên hàm tạo cho số cách tạo thành giá trị của trong đó tất cả n súc sắc hiển thị giá trị của k hoặc lớn hơn làXnk

(2)f(n,d,k)(x)n=xkn(1xdk+11x)n.

Hàm tạo này bao gồm các thuật ngữ cho các sự kiện trong đó vượt quá k , vì vậy chúng ta cần trừ chúng đi. Do đó, hàm tạo cho số cách tạo thành giá trị của X , được cho K = k , làKkXK=k

(3)f(n,d,k)(x)nf(n,d,k+1)(x)n.

Lưu ý rằng tổng của giá trị cao nhất là tổng của tất cả các giá trị trừ đi nhỏ nhất, tương đương với X - K . Do đó, hàm tạo cần được chia cho k . Nó trở thành một hàm tạo xác suất khi nhân với cơ hội chung của bất kỳ tổ hợp xúc xắc nào, ( 1 / d ) n :n1XKk(1/d)n

(4)dnk=1dxk(f(n,d,k)(x)nf(n,d,k+1)(x)n).

Vì tất cả các sản phẩm và quyền hạn đa thức đều có thể được tính toán trong các phép toán (chúng là các kết quả và do đó có thể được thực hiện với Biến đổi Fourier nhanh rời rạc), nên tổng nỗ lực tính toán là O ( kO(nlogn) . Đặc biệt,nó là một thuật toán thời gian đa thức.O(knlogn)


Thí dụ

Chúng ta hãy làm việc qua ví dụ trong câu hỏi với d = 6 .n=4d=6

Công thức cho PGF của X có điều kiện trên K k cho(1)XKk

f(4,6,1)(x)=x+x2+x3+x4+x5+x6f(4,6,2)(x)=x2+x3+x4+x5+x6f(4,6,5)(x)=x5+x6f(4,6,6)(x)=x6f(4,6,7)(x)=0.

Nâng chúng lên công suất như trong công thức ( 2 ) tạo ran=4(2)

f(4,6,1)(x)4=x4+4x5+10x6++4x23+x24f(4,6,2)(x)4=x8+4x9+10x10++4x23+x24f(4,6,5)(x)4=x20+4x21+6x22+4x23+x24f(4,6,6)(x)4=x24f(4,6,7)(x)4=0

Sự khác biệt kế tiếp của chúng trong công thức (3)

f(4,6,1)(x)4f(4,6,2)(x)4=x4+4x5+10x6++12x18+4x19f(4,6,2)(x)4f(4,6,3)(x)4=x8+4x9+10x10++4x20f(4,6,5)(x)4f(4,6,6)(x)4=x20+4x21+6x22+4x23f(4,6,6)(x)4f(4,6,7)(x)4=x24.

Tổng kết quả trong công thức (4)

64(x3+4x4+10x5+21x6+38x7+62x8+91x9+122x10+148x11+167x12+172x13+160x14+131x15+94x16+54x17+21x18).

Ví dụ: cơ hội mà ba con xúc xắc hàng đầu tổng hợp thành là hệ số x 14 , bằng14x14

64×160=10/81=0.123456790123456.

Đó là hoàn toàn phù hợp với xác suất được trích dẫn trong câu hỏi.

Nhân tiện, giá trị trung bình (theo tính toán từ kết quả này) là và độ lệch chuẩn là15869/129612.244598765.13612487/16796162.8468444

Một phép tính tương tự (không tối ưu hóa) cho n=400 xúc xắc thay vì mất chưa đến nửa giây, hỗ trợ cho sự tranh luận rằng đây không phải là thuật toán đòi hỏi tính toán. Đây là một âm mưu của phần chính của phân phối:n=4

Figure

Kể từ khi tối thiểu là rất có khả năng để bằng 1 và tổng X sẽ cực kỳ chặt chẽ để có một bình thường ( 400 × 7 / 2 , 400 × 35 / 12 ) phân phối (có nghĩa là 1400 và độ lệch chuẩn là khoảng 34,1565 ), các trung bình phải cực kỳ gần với 1400 - 1 = 1399 và độ lệch chuẩn cực kỳ gần với 34,16 . Điều này mô tả độc đáo cốt truyện, cho thấy nó có khả năng đúng. Trong thực tế, tính toán chính xác cho một ý nghĩa xung quanhK1X(400×7/2,400×35/12)140034.156514001=139934.16 lớn hơn 1399 và một độ lệch chuẩn khoảng 1,24 × 10 - 31 ít hơn2.13×103213991.24×1031 .400×35/12


1
Câu trả lời của bạn rất nhanh và đúng nên tôi đã đánh dấu nó là câu trả lời. Ngoài ra trong một chỉnh sửa tôi đã nói rằng nó cũng sẽ rất hay nếu có tần số nếu có thể. Cho rằng bạn không cần phải chỉnh sửa câu trả lời của mình vì tôi có thể thấy rằng 6^-4hệ số nhân được sử dụng để chuyển đổi từ tần số sang xác suất.
SkySpirus7

6

Chỉnh sửa: @SkySpirus đã gặp sự cố khi công thức dưới đây hoạt động. Hiện tại tôi không có thời gian để tìm hiểu vấn đề là gì, vì vậy nếu bạn đọc nó thì tốt nhất nên tiếp tục với giả định đó là không chính xác.


Tôi không chắc chắn về vấn đề chung với số lượng xúc xắc, cạnh và giọt khác nhau, nhưng tôi nghĩ rằng tôi có thể thấy một thuật toán hiệu quả cho trường hợp thả 1. Vòng loại là tôi không hoàn toàn chắc chắn rằng nó đúng, nhưng hiện tại tôi không thể thấy bất kỳ sai sót nào.

Hãy bắt đầu bằng cách không thả bất kỳ con xúc xắc nào. Giả sử đại diện cho cái chết thứ n và giả sử Y n đại diện cho tổng số n xúc xắc. Sau đóXnnYnn

p(Yn=a)=kp(Yn1=ak)p(Xn=k)

Bây giờ giả sử là tổng của n xúc xắc khi một người chết bị rơi. Sau đóZnn

p(Zn=a)=p(nth die is the smallest)p(Yn1=a)+p(nth die is not the smallest)kp(Zn1=ak)p(Xn=k)

Nếu chúng ta định nghĩa là phân phối tối thiểu của n chết, thìMnn

p(Zn=a)=p(XnMn1)p(Yn1=a|XnMn1)+p(Xn>Mn1)kp(Zn1=ak)p(Xn=k|Xn>Mn1)

and we can calculate Mn using

p(Mn=a)=p(XnMn1)p(Xn=a|XnMn1)+p(Xn>Mn1)p(Mn1=a|Xn>Mn1)

Yn,ZnMnn

p(XnMn1)Xn,Mn1 can each only take on one of six values, we can just sum over all possibilities:

p(XnMn1)=a,bp(Xn=a,Mn1=b,ab)

Similarly, p(Xn=k|Xn>Mn1) can be calculated by applying Bayes rule then summing over the possible values of Xn,Mn1.


1
+1 This looks correct and you said that's it's quadratic. But it's been a few years since I took statistics (I'm primarily a programmer). So I'd like to fully understand this before marking it as the answer. Also I see you have p(nth is the smallest die) does this include if nth is tied with the smallest? Such as rolling all 3s.
SkySpiral7

Good catch. If the nth die rolled is the same as the current minimum, we can regard that die as the one to be dropped. In which case the distribution is Yn1. I've swapped some (<)s for ()s to reflect this.
Andy Jones

Thank you. If I understand this correctly I think your formulas are the answer. However I don't know how to calculate p(X(n) > M(n-1)) (or the negation of it) or p(X(n)=k|X(n) > M(n-1)) so I can't use this answer yet. I'll mark this as the answer but I'd like more information. Can you edit your answer to explain these or should I post it as another question?
SkySpiral7

Edited my answer.
Andy Jones

1
Sorry I know it's been a year and a half but I've finally gotten around to implementing this formula into code. However the p(Z(n)=a) formula appears incorrect. Suppose 2 dice with 2 sides (drop lowest), what are the chances of the result being 1? The chance of X(n) being the smallest or tied is 3/4 and p(Y(n-1)=1) is 1/2 so that Z(n) returns at least 3/8 even though the correct answer is 1/4. The Z formula looks correct to me and I don't know how to fix it. So if it's not too much to ask: what do you think?
SkySpiral7

1

I have a reasonably efficient algorithm for this that, on testing, seems to match results of pure brute force while relying less heavily on enumerating all possibilities. It's actually more generalized than the above problem of 4d6, drop 1.

Some notation first: Let XNdY indicate that you are rolling X dice with Y faces (integer values 1 to Y), and considering only the highest N dice rolled. The output is a sequence of dice values, e.g. 43d6 yields 3,4,5 if you rolled 1,3,4,5 on the four dice. (Note that I'm calling it a "sequence," but the order is not important here, particularly since all we care about in the end is the sum of the sequence.)

The probability P(XNdY=S) (or more specifically, P(43d6=S)) is a simplified version of the original problem, where we are only considering a specific set of dice, and not all possible sets that add up to a given sum.

Suppose S has k distinct values, s0,s1,...,sk, such that si>si+1, and each si has a count of ci. For example, if S=3,4,4,5, then (s0,c0)=(5,1), (s1,c1)=(4,2), and (s2,c2)=(3,1).

You can calculate P(XNdY=S) in the following way:

P(XNdY=S)=(i=0k1(Xh=0i1chci))(j=0XN(ck+XNck+XNj)(sk1)j)YX

That's pretty messy, I know.

The product expression i=0k1 is iterating through all but the lowest of the values in S, and calculating all the ways those values may be distributed among the dice. For s0, that's just (Xci), but for s1, we have to remove the c0 dice that have already been set aside for s0, and likewise for si you must remove h=0i1ch.

The sum expression j=0XN is iterating through all the possibilities of how many of the dropped dice were equal to sk, since that affects the possible combinations for the un-dropped dice with sk as their value.

By example, let's consider P[43d6=(5,4,4)]:

(s1,c1)=(5,1)
(s2,c2)=(4,2)

So using the formula above:

P[43d6=(5,4,4)]=(41)((33)30+(32)31)64=5162=0.0308641975¯

The formula breaks down on a domain issue when sk=1 and j=0 in the summation, leading to a first term of 00, which is indeterminate and needs to be treated as 1. In such a case, a summation is not actually necessary at all, and can be omitted, since all the dropped dice will also have a value of sk=1.

Now here's where I do need to rely on some brute force. The original problem was to calculate the probability of the sum being some value, and XNdY represents the individual dice left after dropping. This means you must add up the probabilities for all possible sequences S (ignoring ordering) whose sum is the given value. Perhaps there is a formula to calculate this across all such values of S at once, but I haven't even tried broaching that yet.

I've implemented this in Python first, and the above is an attempt to express it mathematically. My Python algorithm is accurate and reasonably efficient. There are some optimizations that could be made for the case of calculating the entire distribution of XNdY, and maybe I'll do that later.


As a programmer it might be easier for me to understand your Python code (although I've never used Python so it might be the same). Posting the code here is off topic but you could post a link to github etc.
SkySpiral7

1
Your answer may be correct and it seems to reduce the complexity from O(Y^X) to O((Y+X-1)!/(X!*(Y-1)!)) but it still isn't as efficient as whuber's answer of O(c*X*log(X)). Thanks for your answer though +1.
SkySpiral7
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.