local sqrt, log, random, pi, floor = math.sqrt, math.log, math.random, math.pi, math.floor local function gauss(mi, sigmaSquared) local x1, x2, w, y1, y2 repeat x1 = 2.0 * random() - 1.0 x2 = 2.0 * random() - 1.0 w = x1 * x1 + x2 * x2 until w <= 1.0 w = sqrt( (-2.0 * log( w ) ) / w ) y1 = x1 * w y2 = x2 * w return y1*sigmaSquared+mi, y2*sigmaSquared+mi end local function dice(N, sides) local mi, sigmaSquared = N*(sides-1)/2 + 1, (sides-1)*N/(2*pi) local y1,y2 = gauss(mi, sigmaSquared) y1,y2 = floor(y1+0.5), floor(y2+0.5) y1 = (y1<N) and N or ((y1>sides*N) and sides*N or y1) y2 = (y2<N) and N or ((y2>sides*N) and sides*N or y2) return y1,y2 end
Comments