乱数で変化させているはずが値が同一となってしまう
Rubyを最近使い始めまして,勉強中の身です.
熱雑音生成のプログラムを書いているのですが,UnitTestをしたところ,乱数で降ってるはずなのに値が更新されず,同一のままになってしまいます.
デバッグをしていますが,原因がわかりません.
ご教授お願い致します.
詳細は以下のコードになります.
長文失礼しました.
def BoxMullerNoise
rnd = Random.new
return BoxMuller.new_create(rnd)
end
class BoxMuller
attr_accessor :_urng
attr_accessor :_x
attr_accessor :_y
attr_accessor :_saveIns
def self.new_create(urng)
obj = self.new
obj._urng = urng
obj._x = urng.rand(1.0)
obj._y = urng.rand(1.0)
obj._saveInst = obj # インスタンスの保存
return obj
end
def value # この中身の_x, _yが,popfrontをUnitTestでしているのに更新されない
p _x
p _y
return Math.sqrt((-2.0) * Math.log(_x)) * Complex(Math.cos(2*Math::PI*_y), Math.sin(2*Math::PI*_y))
end
@@empty = false
def popfront
p "BoxMullerクラス内です"
_x = _urng.rand(1.0)
_y = _urng.rand(1.0)
end
def seed(seed)
srand(seed)
end
def save
_keepInst = _saveInst
_keepInst._urng = _urng
return _keepInst
end
end
def noisePower(bandwidth, tempK)
return bandwidth * tempK * BoltzmannConst
end
class ThermalNoise
attr_accessor :_rnd
attr_accessor :_gain
attr_accessor :_saveInst
def self.new_create(sampFreq, tempK, seed = Random.new.seed)
obj = self.new
obj._rnd = BoxMullerNoise()
obj._gain = Math.sqrt(noisePower(sampFreq, tempK) / 2)
obj._rnd.seed(seed)
obj._saveInst = obj # インスタンスの保存
return obj
end
def value
return _rnd.value * _gain
end
@@empty = false
def popfront
p "ThermalNoiseクラス内です"
_rnd.popfront
end
def save
_keepInst = _saveInst
_keepInst._rnd = _saveInst._rnd.save
p _keepInst
return _keepInst
end
end
# UnitTest
class UnitTest < Test::Unit::TestCase
def test_ThermalNoise
buf = Array.new(64*1024)
rndSeed = 114514
thermalNoise = ThermalNoise.new_create((20*10**6)*4, 300, rndSeed + 123321)
(0 ... 4).each{ |i|
thermalNoise.popfront # BoxMullerクラスの_x, _yを変えているはずなのに
thermalNoise.value # ここで同じ値が表示されてしまう
}
end
end