/* Highest dice roller in Picat. From https://www.reddit.com/r/Probability/comments/1dxtfe5/probability_of_being_the_highest_roller/ """ Probability of being the highest roller What are the probability percentages for each person rolling the highest number when all three each of them rolls their specific die once. In case of a tie, the person with the largest number of sided die gets the tiebreaker. Person 1 rolls a 12 sided die Person 2 rolls an 8 sided die Person 3 rolls a 4 sided die. """ Cf my Gamble model gamble_highest_dice_roller.rkt This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import ppl_distributions, ppl_utils. import util. main => go. /* For the original question (no observation), the player with D12 wins: var : winner Probabilities: d12: 0.6777000000000000 d8: 0.2834000000000000 d4: 0.0389000000000000 mean = [d12 = 0.6777,d8 = 0.2834,d4 = 0.0389] Here we check the cases were we observe that none, d4, d8, and d12 respectively is the winner. observation = none var : d4 Probabilities: 4: 0.2582000000000000 3: 0.2564000000000000 1: 0.2436000000000000 2: 0.2418000000000000 mean = 2.5292 var : d8 Probabilities: 3: 0.1307000000000000 5: 0.1275000000000000 8: 0.1271000000000000 6: 0.1250000000000000 2: 0.1248000000000000 1: 0.1243000000000000 7: 0.1234000000000000 4: 0.1172000000000000 mean = 4.5029 var : d12 Probabilities: 12: 0.0881000000000000 10: 0.0877000000000000 6: 0.0860000000000000 2: 0.0856000000000000 1: 0.0840000000000000 8: 0.0827000000000000 3: 0.0822000000000000 9: 0.0819000000000000 5: 0.0819000000000000 4: 0.0803000000000000 11: 0.0799000000000000 7: 0.0797000000000000 mean = 6.5182 var : winner Probabilities: d12: 0.6777000000000000 d8: 0.2834000000000000 d4: 0.0389000000000000 mean = [d12 = 0.6777,d8 = 0.2834,d4 = 0.0389] observation = d4 var : d4 Probabilities: 4: 0.6756032171581769 3: 0.2627345844504022 2: 0.0616621983914209 mean = 3.61394 var : d8 Probabilities: 1: 0.4182305630026810 2: 0.3860589812332439 3: 0.1957104557640751 mean = 1.77748 var : d12 Probabilities: 1: 0.4396782841823056 2: 0.3243967828418231 3: 0.2359249329758713 mean = 1.79625 var : winner Probabilities: d4: 1.0000000000000000 mean = [d4 = 1.0] observation = d8 var : d4 Probabilities: 1: 0.2692862292718097 2: 0.2563085796683490 3: 0.2429704397981254 4: 0.2314347512617159 mean = 2.43655 var : d8 Probabilities: 8: 0.2490987743330930 7: 0.2271088680605624 6: 0.1842105263157895 5: 0.1532083633741889 4: 0.1088680605623648 3: 0.0598413842826244 2: 0.0176640230713771 mean = 6.10418 var : d12 Probabilities: 1: 0.2339581831290555 2: 0.2173756308579668 3: 0.1683489545782264 4: 0.1546503244412401 5: 0.1204037490987743 6: 0.0699351117519827 7: 0.0353280461427541 mean = 3.06128 var : winner Probabilities: d8: 1.0000000000000000 mean = [d8 = 1.0] observation = d12 var : d4 Probabilities: 1: 0.2572058823529412 2: 0.2557352941176471 3: 0.2477941176470588 4: 0.2392647058823529 mean = 2.46912 var : d8 Probabilities: 2: 0.1588235294117647 1: 0.1541176470588235 4: 0.1422058823529412 3: 0.1407352941176471 5: 0.1220588235294118 6: 0.1144117647058824 7: 0.0916176470588235 8: 0.0760294117647059 mean = 4.00912 var : d12 Probabilities: 8: 0.1261764705882353 11: 0.1227941176470588 10: 0.1219117647058824 9: 0.1198529411764706 12: 0.1182352941176471 7: 0.1076470588235294 6: 0.0898529411764706 5: 0.0786764705882353 4: 0.0614705882352941 3: 0.0323529411764706 2: 0.0163235294117647 1: 0.0047058823529412 mean = 8.14309 var : winner Probabilities: d12: 1.0000000000000000 mean = [d12 = 1.0] */ go ?=> member(Obs,[none,d4,d8,d12]), println(observation=Obs), reset_store, run_model(10_000,$model(Obs),[show_probs,mean]), nl, % show_store_lengths, fail, nl. go => true. model(Obs) => D4 = random_integer1(4), D8 = random_integer1(8), D12 = random_integer1(12), Winner = cases([[(D4 > D8, D4 > D12),d4], [(D8 >= D4, D8 > D12),d8], % with tie break D8 over D4 [(D12 >= D4, D12 >= D8),d12], % with tie break D12 over D4 and D8 [true,"someone else"]]), if Obs == none then add("winner",Winner), add("d4",D4), add("d8",D8), add("d12",D12), else observe(Winner == Obs), if observed_ok then add("winner",Winner), add("d4",D4), add("d8",D8), add("d12",D12), end end.