mirror of
https://github.com/Oxalide/vsphere-influxdb-go.git
synced 2023-10-10 13:36:51 +02:00
32 lines
673 B
Ruby
32 lines
673 B
Ruby
|
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
|