de random.gauss() Python y Boost normal_distribution ambos utilizan el Box-Muller transform, por lo que debe ser lo suficientemente bueno para Ruby también.
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
El método se puede incluir en una clase que devuelve las muestras una a una.
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)
En la medida que lo permita la ley, antonakos haya renunciado a los derechos de autor y derechos afines o vecinos a la clase Rubí RandomGaussian
. Este trabajo se publica desde: Dinamarca.
La declaración de la licencia no significa que me preocupe este código. Por el contrario, no uso el código, no lo he probado y no programo en Ruby.
¿Alguna pregunta relacionada con el cheque (ver el panel lateral derecho)? – Gumbo
Sí, revisé y aunque hay lugares que tienen el algoritmo, nadie lo ha codificado en Ruby. Es una tarea tan común que realmente debería estar en la biblioteca estándar. Pero en su defecto, creo que el código de copiar y pegar debe ser encontrado en StackOverflow. – Eponymous
Puede ser una buena idea mencionar lo que ha marcado, de modo que las personas que piensan en responder no lo verifiquen, a menos que piensen que se han perdido algo. –