1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- 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();
- }
|