Python's random.gauss () и Boost's normal_distribution оба используют преобразование Box-Muller , так что этого должно быть достаточно и для 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
Метод может быть заключен в класс, который возвращает образцы по одному.
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)
Насколько это возможно в соответствии с законодательством, antonakos отказался от всех авторских и смежных или смежных прав на класс RandomGaussian
Ruby. Это произведение опубликовано в: Дании.
Заявление о лицензии не означает, что я забочусь об этом коде. Напротив, я не использую код, я не тестировал его и не программирую на Ruby.