/* Number of dice throws until a target is reached in Picat. What is the number of dice throws needed to reach a cumulative sum: * larger or equal to a target number. * exactly on target We test with some different sum. This is a port of my Gamble model gamble_number_of_dice_trows_to_target.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. main => go. /* target = 6 mode = exactly_on_target var : n Probabilities: 1: 0.4661016949152542 2: 0.3720612356478950 3: 0.1407873154729360 4: 0.0196828868234008 5: 0.0013668671405139 mean = 1.71815 mode = on_or_above_target var : n Probabilities: 2: 0.5609000000000000 3: 0.2272000000000000 1: 0.1698000000000000 4: 0.0392000000000000 5: 0.0027000000000000 6: 0.0002000000000000 mean = 2.1447 var : s Probabilities: 6: 0.3620000000000000 7: 0.1955000000000000 8: 0.1668000000000000 9: 0.1291000000000000 10: 0.0940000000000000 11: 0.0526000000000000 mean = 7.5554 target = 10 mode = exactly_on_target var : n Probabilities: 3: 0.4318341531974701 2: 0.2856640899508082 4: 0.2189037245256500 5: 0.0544624033731553 6: 0.0077301475755446 7: 0.0014054813773717 mean = 3.07098 mode = on_or_above_target var : n Probabilities: 3: 0.4566000000000000 4: 0.2817000000000000 2: 0.1659000000000000 5: 0.0806000000000000 6: 0.0129000000000000 7: 0.0021000000000000 8: 0.0002000000000000 mean = 3.3251 var : s Probabilities: 10: 0.2900000000000000 11: 0.2453000000000000 12: 0.1936000000000000 13: 0.1304000000000000 14: 0.0918000000000000 15: 0.0489000000000000 mean = 11.6354 target = 21 mode = exactly_on_target var : n Probabilities: 6: 0.3203716448726772 5: 0.2450103234686855 7: 0.2298692360633173 8: 0.1135581555402615 4: 0.0540261527873365 9: 0.0268410185822436 10: 0.0092911218169305 11: 0.0006882312456986 12: 0.0003441156228493 mean = 6.22712 mode = on_or_above_target var : n Probabilities: 6: 0.3199000000000000 7: 0.2586000000000000 5: 0.2029000000000000 8: 0.1315000000000000 9: 0.0470000000000000 4: 0.0269000000000000 10: 0.0109000000000000 11: 0.0018000000000000 12: 0.0005000000000000 mean = 6.4615 var : s Probabilities: 21: 0.2847000000000000 22: 0.2405000000000000 23: 0.1883000000000000 24: 0.1424000000000000 25: 0.0966000000000000 26: 0.0475000000000000 mean = 22.6682 target = 61 mode = exactly_on_target var : n Probabilities (truncated): 18: 0.1921367521367521 17: 0.1890598290598291 19: 0.1490598290598291 16: 0.1473504273504274 ......... 24: 0.0034188034188034 25: 0.0020512820512821 12: 0.0010256410256410 27: 0.0006837606837607 mean = 17.7108 mode = on_or_above_target var : n Probabilities (truncated): 17: 0.1913000000000000 18: 0.1909000000000000 16: 0.1476000000000000 19: 0.1463000000000000 ......... 25: 0.0016000000000000 12: 0.0006000000000000 26: 0.0003000000000000 27: 0.0001000000000000 mean = 17.876 var : s Probabilities: 61: 0.2878000000000000 62: 0.2359000000000000 63: 0.1879000000000000 64: 0.1481000000000000 65: 0.0919000000000000 66: 0.0484000000000000 mean = 62.6656 target = 100 mode = exactly_on_target var : n Probabilities (truncated): 28: 0.1580985915492958 29: 0.1535211267605634 27: 0.1235915492957746 30: 0.1225352112676056 ......... 37: 0.0028169014084507 22: 0.0021126760563380 21: 0.0007042253521127 38: 0.0003521126760563 mean = 28.8264 mode = on_or_above_target var : n Probabilities (truncated): 29: 0.1485000000000000 28: 0.1439000000000000 30: 0.1357000000000000 27: 0.1201000000000000 ......... 38: 0.0012000000000000 21: 0.0005000000000000 40: 0.0002000000000000 39: 0.0002000000000000 mean = 29.0575 var : s Probabilities: 100: 0.2865000000000000 101: 0.2370000000000000 102: 0.1927000000000000 103: 0.1416000000000000 104: 0.0949000000000000 105: 0.0473000000000000 mean = 101.663 */ go ?=> member(Target,[6,10,21,61,100]), println(target=Target), member(Mode,[exactly_on_target,on_or_above_target]), println(mode=Mode), reset_store(), run_model(10_000,$model(Target,Mode),[show_probs_trunc,mean]), nl, fail, nl. go => true. model(Target,Mode) => Range = 1..6, S = 0, N = 0, Run = true, while(Run == true) if S >= Target then Run := false else S := S + uniform_draw(Range), N := N + 1 end end, if Mode = exactly_on_target then observe(S == Target) else observe(S >= Target) end, if observed_ok then add("n",N), if Mode == on_or_above_target then add("s",S) end end.