RandomEngine.cs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using System;
  2. namespace HandyControl.Expression.Drawing;
  3. internal class RandomEngine
  4. {
  5. private double? _anotherSample;
  6. private Random _random;
  7. public RandomEngine(long seed) => Initialize(seed);
  8. private double Gaussian()
  9. {
  10. double num;
  11. double num2;
  12. double num3;
  13. if (_anotherSample.HasValue)
  14. {
  15. var num4 = _anotherSample.Value;
  16. _anotherSample = null;
  17. return num4;
  18. }
  19. do
  20. {
  21. num2 = 2.0 * Uniform() - 1.0;
  22. num3 = 2.0 * Uniform() - 1.0;
  23. num = num2 * num2 + num3 * num3;
  24. } while (num >= 1.0);
  25. var num5 = Math.Sqrt(-2.0 * Math.Log(num) / num);
  26. _anotherSample = num2 * num5;
  27. return num3 * num5;
  28. }
  29. private void Initialize(long seed) => _random = new Random((int) seed);
  30. public double NextGaussian(double mean, double variance) => Gaussian() * variance + mean;
  31. public double NextUniform(double min, double max) => Uniform() * (max - min) + min;
  32. private double Uniform() => _random.NextDouble();
  33. }