math.randomseed(os.time())
local result_pos_t = {}
local function result_pos(num, max)
local k = num .. ',' .. max
if not result_pos_t[k] then
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 = 10
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
Cm1hdGgucmFuZG9tc2VlZChvcy50aW1lKCkpCgpsb2NhbCByZXN1bHRfcG9zX3QgPSB7fQpsb2NhbCBmdW5jdGlvbiByZXN1bHRfcG9zKG51bSwgbWF4KQoJbG9jYWwgayA9IG51bSAuLiAnLCcgLi4gbWF4CglpZiBub3QgcmVzdWx0X3Bvc190W2tdIHRoZW4KCQlpZiBudW0gPT0gMCB0aGVuCgkJCXJlc3VsdF9wb3NfdFtrXSA9IChtYXggLSBudW0pICsgMQoJCWVsc2UKCQkJcmVzdWx0X3Bvc190W2tdID0gcmVzdWx0X3BvcyhudW0gLSAxLCBtYXgpICsgKG1heCAtIG51bSkgKyAxCgkJZW5kCgllbmQKCXJldHVybiByZXN1bHRfcG9zX3Rba10KZW5kCgpsb2NhbCBmdW5jdGlvbiBjcmF6eV9kaWNlKG4pCglsb2NhbCBzaXplID0gcmVzdWx0X3BvcyhuLCBuKQoJbG9jYWwgcmFuZCA9IG1hdGgucmFuZG9tKHNpemUpCglmb3IgaSA9IDAsIG4gZG8KCQlpZiByYW5kIDw9IHJlc3VsdF9wb3MoaSwgbikgdGhlbgoJCQlyZXR1cm4gaQoJCWVuZAoJZW5kCgllcnJvcigpCmVuZAoKbG9jYWwgdGFsbHkgPSB7fQpsb2NhbCBjb3VudCA9IDEwMDAwMApsb2NhbCBzaWRlcyA9IDEwCmZvciBpID0gMSwgY291bnQgZG8KCWxvY2FsIHJlcyA9IGNyYXp5X2RpY2Uoc2lkZXMpCglpZiBub3QgdGFsbHlbcmVzXSB0aGVuIHRhbGx5W3Jlc10gPSAxCgllbHNlIHRhbGx5W3Jlc10gPSB0YWxseVtyZXNdICsgMQoJZW5kCmVuZAoKZm9yIGkgPSAwLCBzaWRlcyBkbwoJcHJpbnQoaSwgKHRhbGx5W2ldIG9yIDEpIC8gY291bnQpCmVuZA==