#==============================================================================
# ■ 服从正态分布的随机数
#------------------------------------------------------------------------------
# 使用方法:zhengtai_rand(m, n)
# 可以按正态分布率取到闭区间[m,n]之间的整数...
#------------------------------------------------------------------------------
# 作者:聪仔
# 转载请保留脚本来源:本脚本来自rpg.blue
#==============================================================================
module Kernel
#==============================================================================
# 常数精确度设置
# EI:自然常数e
# PI:圆周率π
#------------------------------------------------------------------------------
EI = 2.71828183
PI = 3.14159265
#==============================================================================
#--------------------------------------------------------------------------
# ● 随机变量按照正态分布率取到p的概率
# (系统处理速度会随着m、n的间距增大而减慢)
#--------------------------------------------------------------------------
def zhengtai(m, n, p)
return if !m.is_a?(Integer) or !n.is_a?(Integer) or !p.is_a?(Integer)
return if m > n or p > n or m > p
return if n - m <= 5 # 数值m和n的距离不应小于5,否则没必要满足正态分布
return EI ** (-4.5 * ((n + m - 2.0 * p) / (n - m)) ** 2.0) * 6.0 / ((n - m) * ((2.0 * PI) ** 0.5))
end
#--------------------------------------------------------------------------
# ● 按照正态分布率取随机数
#--------------------------------------------------------------------------
def zhengtai_rand(m, n)
return unless zhengtai(m, n, n - m -1)
# 初始化局部变量
gailv_arr, range_arr = [], []
a, b = 0, 0
# 把m到n之间取得各个p值的区间的概率存入数组
(m..n).each{|i| gailv_arr.push(zhengtai(m, n, i))}
# 叠加数组各个区间,得到形如[0...m][m...m+p1][m+p1...m+p1+p2][m+p1+p2...m+p1+p2+p3]
# 的范围数组,这些数组的各个区间满足正态分布,且区间之和≈1
gailv_arr.each_with_index{|i, index|
b = gailv_arr[index]
range_arr.push(a...(a + b)) if index != 0 and !b.nil?
# 数组gailv_arr叠加
a += b unless b.nil?}
range_arr.unshift(0...gailv_arr[0])
random_value = rand until (0...a) === random_value
# 随机数random_value落在range_arr的哪个区间,就取这个区间对应的数组序号+范围起点m
return m + range_arr.index(range_arr.find{|i| i === random_value})
end
#--------------------------------------------------------------------------
# ● 正态分布效果测试
# (系统需要处理较长时间,请耐心等待)
# 此测试方法是根据P叔的测试方法改写的...
#--------------------------------------------------------------------------
def zhengtai_test
a = Sprite.new
a.bitmap = Bitmap.new(544, 416)
color = Color.new(0, 0, 255)
b = Array.new.fill(416, 0..256)
10000.times do
x = zhengtai_rand(0, 256)
b[x] -= 1
a.bitmap.set_pixel(x, b[x], color)
end
p "生成完毕..."
end
end