Advertisement
Vladar

RNG Dice Roller for dicepools

Aug 30th, 2015
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.24 KB | None | 0 0
  1. import math, strutils
  2.  
  3. proc roll(num=1, faces=6, target=6, pierce=true, explode=true): int =
  4.   if target > faces:
  5.     return 0
  6.   for n in 1..num:
  7.     let r = random(faces) + 1
  8.     if r >= target:
  9.       inc(result)
  10.       if explode and r == faces:
  11.         result += roll(1, faces, target, pierce, explode)
  12.     elif pierce and r == 1:
  13.       dec(result)
  14.  
  15. const
  16.   Rolls = 1_000_000
  17.   Range = 100  # Static array range
  18.   Precision = 4 # Probably don't need any lower
  19.   N = 6   # Dice count
  20.   D = 6   # Face count
  21.  
  22. var
  23.   results: array[-Range..Range, int]
  24.  
  25. randomize()
  26.  
  27. for i in 1..Rolls:
  28.   let r = roll(N, D)
  29.   inc(results[r])
  30.  
  31. var lowest, highest: int
  32. for i in countup(low(results), high(results)):
  33.   if results[i] > 0:
  34.     lowest = i
  35.     break
  36. for i in countdown(high(results), low(results)):
  37.   if results[i] > 0:
  38.     highest = i
  39.     break
  40.  
  41. let total = sum(results)
  42.  
  43. var percentage: array[-Range..Range, float]
  44. for i in lowest..highest:
  45.   percentage[i] = 100.0 * results[i].float / total.float
  46.  
  47. for i in lowest..highest:
  48.   let fmt = percentage[i].formatFloat(ffDecimal, Precision)
  49.   echo "",  spaces(($Range).len-($i).len), $i, ": ",
  50.     spaces(Precision + 3 - fmt.len), fmt, "  ",
  51.     repeat('#', percentage[i].round)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement