From 0432dd066e312d73c840ab8e8445dfeb8fbdbf4d Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sat, 26 Sep 2020 12:00:46 +0200 Subject: [PATCH] Added NextNumber for (0, 1) --- FastRng/Double/Distributions/Gamma.cs | 8 ++++---- FastRng/Double/IRandom.cs | 4 +++- FastRng/Double/MultiThreadedRng.cs | 6 ++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/FastRng/Double/Distributions/Gamma.cs b/FastRng/Double/Distributions/Gamma.cs index 266c381..dc9f90a 100644 --- a/FastRng/Double/Distributions/Gamma.cs +++ b/FastRng/Double/Distributions/Gamma.cs @@ -6,6 +6,8 @@ namespace FastRng.Double.Distributions { public sealed class Gamma : IDistribution { + private static readonly IDistribution NORMAL_DISTRIBUTION = new Normal(); + private double shape = 1.0; public IRandom Random { get; set; } @@ -35,7 +37,6 @@ namespace FastRng.Double.Distributions if (shape >= 1.0) { - var distNormal = new Normal(); var d = shape - 1.0 / 3.0; var c = 1.0 / Math.Sqrt(9.0 * d); while(true) @@ -43,7 +44,7 @@ namespace FastRng.Double.Distributions double x, v; do { - x = await this.Random.NextNumber(0, 1, distNormal, token); + x = await this.Random.NextNumber(NORMAL_DISTRIBUTION, token); v = 1.0 + c * x; } while (v <= 0.0); @@ -59,8 +60,7 @@ namespace FastRng.Double.Distributions else { var dist = new Gamma{ Scale = 1, Shape = 1 + this.Shape}; - - var g = await this.Random.NextNumber(0.0f, 1.0f, dist, token); // TODO: Use double + var g = await this.Random.NextNumber(dist, token); var w = await this.Random.GetUniform(token); return this.Scale * g * Math.Pow(w, 1.0 / this.Shape); } diff --git a/FastRng/Double/IRandom.cs b/FastRng/Double/IRandom.cs index 54f1511..396d0b8 100644 --- a/FastRng/Double/IRandom.cs +++ b/FastRng/Double/IRandom.cs @@ -12,7 +12,9 @@ namespace FastRng.Double public ValueTask NextNumber(ulong rangeStart, ulong rangeEnd, IDistribution distribution, CancellationToken cancel = default); - public ValueTask NextNumber(float rangeStart, float rangeEnd, IDistribution distribution, CancellationToken cancel = default); + public ValueTask NextNumber(double rangeStart, double rangeEnd, IDistribution distribution, CancellationToken cancel = default); + + public ValueTask NextNumber(IDistribution distribution, CancellationToken cancel = default); public void StopProducer(); } diff --git a/FastRng/Double/MultiThreadedRng.cs b/FastRng/Double/MultiThreadedRng.cs index 3518eef..50e75b7 100644 --- a/FastRng/Double/MultiThreadedRng.cs +++ b/FastRng/Double/MultiThreadedRng.cs @@ -167,7 +167,7 @@ namespace FastRng.Double return (ulong) ((distributedValue * range) + rangeStart); } - public async ValueTask NextNumber(float rangeStart, float rangeEnd, IDistribution distribution, CancellationToken cancel = default(CancellationToken)) + public async ValueTask NextNumber(double rangeStart, double rangeEnd, IDistribution distribution, CancellationToken cancel = default(CancellationToken)) { if (rangeStart > rangeEnd) { @@ -180,9 +180,11 @@ namespace FastRng.Double distribution.Random = this; var distributedValue = await distribution.GetDistributedValue(cancel); - return (float) ((distributedValue * range) + rangeStart); + return (distributedValue * range) + rangeStart; } + public async ValueTask NextNumber(IDistribution distribution, CancellationToken cancel = default) => await this.NextNumber(0.0, 1.0, distribution, cancel); + public void StopProducer() => this.producerToken.Cancel(); #endregion