1. ホーム
  2. ruby

[解決済み] Rubyでガウス(正規分布)乱数を生成するコード

2022-02-24 18:38:59

質問

Rubyで正規分布に基づく乱数を生成するコードを教えてください。

(注:自分自身の質問には答えましたが、誰かがより良い答えを持っているかどうか、受け入れる前に数日待ってみます)

EDITです。

これを検索して、2つの検索の結果得られたSOの全ページを見ました。

+正規分布ルビー

+ガウシアン +ランダムルビー

解決方法は?

Pythonの ランダム.ガウス() とBoostの 正規分布 はどちらも ボックスミュラー変換 ということで、Rubyでも十分なはずです。

def gaussian(mean, stddev, rand)
  theta = 2 * Math::PI * rand.call
  rho = Math.sqrt(-2 * Math.log(1 - rand.call))
  scale = stddev * rho
  x = mean + scale * Math.cos(theta)
  y = mean + scale * Math.sin(theta)
  return x, y
end

このメソッドは、サンプルを1つずつ返すクラスでラップすることができます。

class RandomGaussian
  def initialize(mean, stddev, rand_helper = lambda { Kernel.rand })
    @rand_helper = rand_helper
    @mean = mean
    @stddev = stddev
    @valid = false
    @next = 0
  end

  def rand
    if @valid then
      @valid = false
      return @next
    else
      @valid = true
      x, y = self.class.gaussian(@mean, @stddev, @rand_helper)
      @next = y
      return x
    end
  end

  private
  def self.gaussian(mean, stddev, rand)
    theta = 2 * Math::PI * rand.call
    rho = Math.sqrt(-2 * Math.log(1 - rand.call))
    scale = stddev * rho
    x = mean + scale * Math.cos(theta)
    y = mean + scale * Math.sin(theta)
    return x, y
  end
end

<イグ (CC0)

法律で定められた可能な範囲内で アントナコス に対するすべての著作権および関連・著作隣接権を放棄しています。 RandomGaussian Rubyクラス。この作品は、デンマークから出版されています。