math.randomseed(os.time())
local result_pos_t = {}
local function result_pos(num, max)
local k = table.concat({...}, ',')
if not result_pos_t[k]
if num == 0 then
result_pos_t[k] = (max - num) + 1
else
result_pos_t[k] = result_pos(num - 1, max) + (max - num) + 1
end
end
return result_pos_t[k]
end
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
Cm1hdGgucmFuZG9tc2VlZChvcy50aW1lKCkpCgpsb2NhbCByZXN1bHRfcG9zX3QgPSB7fQpsb2NhbCBmdW5jdGlvbiByZXN1bHRfcG9zKG51bSwgbWF4KQoJbG9jYWwgayA9IHRhYmxlLmNvbmNhdCh7Li4ufSwgJywnKQoJaWYgbm90IHJlc3VsdF9wb3NfdFtrXQoJCWlmIG51bSA9PSAwIHRoZW4KCQkJcmVzdWx0X3Bvc190W2tdID0gKG1heCAtIG51bSkgKyAxCgkJZWxzZQoJCQlyZXN1bHRfcG9zX3Rba10gPSByZXN1bHRfcG9zKG51bSAtIDEsIG1heCkgKyAobWF4IC0gbnVtKSArIDEKCQllbmQKCWVuZAoJcmV0dXJuIHJlc3VsdF9wb3NfdFtrXQplbmQKCmxvY2FsIGZ1bmN0aW9uIGNyYXp5X2RpY2UobikKCWxvY2FsIHNpemUgPSByZXN1bHRfcG9zKG4sIG4pCglsb2NhbCByYW5kID0gbWF0aC5yYW5kb20oc2l6ZSkKCWZvciBpID0gMCwgbiBkbwoJCWlmIHJhbmQgPD0gcmVzdWx0X3BvcyhpLCBuKSB0aGVuCgkJCXJldHVybiBpCgkJZW5kCgllbmQKCWVycm9yKCkKZW5kCgpsb2NhbCB0YWxseSA9IHt9CmxvY2FsIGNvdW50ID0gMTAwMDAwCmxvY2FsIHNpZGVzID0gMzAKZm9yIGkgPSAxLCBjb3VudCBkbwoJbG9jYWwgcmVzID0gY3JhenlfZGljZShzaWRlcykKCWlmIG5vdCB0YWxseVtyZXNdIHRoZW4gdGFsbHlbcmVzXSA9IDEKCWVsc2UgdGFsbHlbcmVzXSA9IHRhbGx5W3Jlc10gKyAxCgllbmQKZW5kCgpmb3IgaSA9IDAsIHNpZGVzIGRvCglwcmludChpLCAodGFsbHlbaV0gb3IgMSkgLyBjb3VudCkKZW5k