math.randomseed(os.time())
local function result_pos(num, max)
if num == 0 then
return (max - num) + 1
else
return result_pos(num - 1, max) + (max - num) + 1
end
end
local function memoize(fn)
local t = {}
return function(...)
local k = table.concat({...}, ',')
if not t[k] then
t[k] = fn(...)
end
return t[k]
end
end
local result_pos = memoize(result_pos)
local function crazy_dice(n)
local size = result_pos(n, n)
local rand = math.random(size)
for i = 0, n do
if rand <= result_pos(i, n) then
return i
end
end
error()
end
local tally = {}
local count = 100000
local sides = 30
for i = 1, count do
local res = crazy_dice(sides)
if not tally[res] then tally[res] = 1
else tally[res] = tally[res] + 1
end
end
for i = 0, sides do
print(i, (tally[i] or 1) / count)
end
Cm1hdGgucmFuZG9tc2VlZChvcy50aW1lKCkpCgpsb2NhbCBmdW5jdGlvbiByZXN1bHRfcG9zKG51bSwgbWF4KQoJaWYgbnVtID09IDAgdGhlbgoJCXJldHVybiAobWF4IC0gbnVtKSArIDEKCWVsc2UKCQlyZXR1cm4gcmVzdWx0X3BvcyhudW0gLSAxLCBtYXgpICsgKG1heCAtIG51bSkgKyAxCgllbmQKZW5kCgpsb2NhbCBmdW5jdGlvbiBtZW1vaXplKGZuKQoJbG9jYWwgdCA9IHt9CglyZXR1cm4gZnVuY3Rpb24oLi4uKQoJCWxvY2FsIGsgPSB0YWJsZS5jb25jYXQoey4uLn0sICcsJykKCQlpZiBub3QgdFtrXSB0aGVuCgkJCXRba10gPSBmbiguLi4pCgkJZW5kCgkJcmV0dXJuIHRba10KCWVuZAplbmQKCmxvY2FsIHJlc3VsdF9wb3MgPSBtZW1vaXplKHJlc3VsdF9wb3MpCgpsb2NhbCBmdW5jdGlvbiBjcmF6eV9kaWNlKG4pCglsb2NhbCBzaXplID0gcmVzdWx0X3BvcyhuLCBuKQoJbG9jYWwgcmFuZCA9IG1hdGgucmFuZG9tKHNpemUpCglmb3IgaSA9IDAsIG4gZG8KCQlpZiByYW5kIDw9IHJlc3VsdF9wb3MoaSwgbikgdGhlbgoJCQlyZXR1cm4gaQoJCWVuZAoJZW5kCgllcnJvcigpCmVuZAoKbG9jYWwgdGFsbHkgPSB7fQpsb2NhbCBjb3VudCA9IDEwMDAwMApsb2NhbCBzaWRlcyA9IDMwCmZvciBpID0gMSwgY291bnQgZG8KCWxvY2FsIHJlcyA9IGNyYXp5X2RpY2Uoc2lkZXMpCglpZiBub3QgdGFsbHlbcmVzXSB0aGVuIHRhbGx5W3Jlc10gPSAxCgllbHNlIHRhbGx5W3Jlc10gPSB0YWxseVtyZXNdICsgMQoJZW5kCmVuZAoKZm9yIGkgPSAwLCBzaWRlcyBkbwoJcHJpbnQoaSwgKHRhbGx5W2ldIG9yIDEpIC8gY291bnQpCmVuZA==