一様にランダム、ガウス分布にランダム

ブラシスクリプトで乱数を発生させるには、

  • math.random( a, b )
  • bs_grand( ave, sd1 )

の二つの方法があります。
普通に一様な分布の乱数を発生させたい場合は、math.randomを使います。math.random( a, b ) と渡せば、aからbの範囲の乱数値を得ることが出来ます。これは、一様な分布をしている、一般的な乱数値です。普通、乱数といえばこちらの事を言います。

偏りのある乱数分布を得たいなら、bs_grand関数を呼び出します。bs_grand( ave, sd1 ) を呼ぶと、aveを中心に、-sd1〜sd1の範囲内に68%の確率に収まるガウス分布正規分布)の乱数を得ることができます。-sd1〜sd1の範囲を大きく超えることもあります。散布ブラシのような偏りのある散布表現をしたい場合などに利用できます。特殊な乱数です。

ブラシスクリプトで比べてみましょう。

function param1()
  return "gauss", 0, 1, 0
end

function main( x, y, p )

  if not firstDraw then
    local d = bs_distance( lastDrawX - x, lastDrawY - y )
    if d < 30 then
      return 0
    end
  end

  local r,g,b = bs_fore()

  local i
  for i=0,2000 do
    local rad = math.random() * 3.14 * 2

    local distance = math.random( 0, 80 )
    if bs_param1() == 1 then
      distance = bs_grand( 0, 60 )
    end

    local dx,dy = bs_rotate( 0, distance, rad )
    bs_pixel_set( x + dx, y + dy, r,g,b,255 )
  end

  lastDrawX = x
  lastDrawY = y
  firstDraw = false

  return 1
end

lastDrawX = 0
lastDrawY = 0
firstDraw = true