45 lines
1.2 KiB
C#
45 lines
1.2 KiB
C#
using System;
|
|
|
|
namespace HandyControl.Expression.Drawing
|
|
{
|
|
internal class RandomEngine
|
|
{
|
|
private double? _anotherSample;
|
|
|
|
private Random _random;
|
|
|
|
public RandomEngine(long seed) => Initialize(seed);
|
|
|
|
private double Gaussian()
|
|
{
|
|
double num;
|
|
double num2;
|
|
double num3;
|
|
if (_anotherSample.HasValue)
|
|
{
|
|
var num4 = _anotherSample.Value;
|
|
_anotherSample = null;
|
|
return num4;
|
|
}
|
|
|
|
do
|
|
{
|
|
num2 = 2.0 * Uniform() - 1.0;
|
|
num3 = 2.0 * Uniform() - 1.0;
|
|
num = num2 * num2 + num3 * num3;
|
|
} while (num >= 1.0);
|
|
|
|
var num5 = Math.Sqrt(-2.0 * Math.Log(num) / num);
|
|
_anotherSample = num2 * num5;
|
|
return num3 * num5;
|
|
}
|
|
|
|
private void Initialize(long seed) => _random = new Random((int) seed);
|
|
|
|
public double NextGaussian(double mean, double variance) => Gaussian() * variance + mean;
|
|
|
|
public double NextUniform(double min, double max) => Uniform() * (max - min) + min;
|
|
|
|
private double Uniform() => _random.NextDouble();
|
|
}
|
|
} |