Refactored

This commit is contained in:
Thorsten Sommer 2020-10-19 19:48:28 +02:00
parent dad5ead650
commit c007c6aef0
2 changed files with 13 additions and 30 deletions

View File

@ -6,31 +6,31 @@ namespace FastRng.Double.Distributions
{ {
public sealed class CauchyLorentz : IDistribution public sealed class CauchyLorentz : IDistribution
{ {
private double scale = 1.0; private const double CONSTANT = 0.31;
private const double SCALE = 0.1;
private const double MEDIAN = 0.0;
public IRandom Random { get; set; } private ShapeFitter fitter;
private IRandom random;
public double Scale public IRandom Random
{ {
get => this.scale; get => this.random;
set set
{ {
if(value <= 0.0) this.random = value;
throw new ArgumentOutOfRangeException(message: "Scale must be greater than 0", null); this.fitter = new ShapeFitter(CauchyLorentz.ShapeFunction, this.random, 50, 0.98);
this.scale = value;
} }
} }
public double Median { get; set; } = 0.0; private static double ShapeFunction(double x) => CONSTANT * (1.0 / (Math.PI * SCALE)) * ((SCALE * SCALE) / (Math.Pow(x - MEDIAN, 2) + (SCALE * SCALE)));
public async ValueTask<double> GetDistributedValue(CancellationToken token = default) public async ValueTask<double> GetDistributedValue(CancellationToken token = default)
{ {
if (this.Random == null) if (this.Random == null)
return double.NaN; return double.NaN;
var value = await this.Random.GetUniform(token); return await this.fitter.NextNumber(token);
return 1.0 / (Math.PI * this.Scale * (1 + Math.Pow((value - this.Median) / this.Scale, 2)));
} }
} }
} }

View File

@ -63,23 +63,6 @@ namespace FastRngTests.Double.Distributions
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0), "Max is out of range");
} }
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public void ParameterTest01()
{
var dist = new FastRng.Double.Distributions.CauchyLorentz();
Assert.Throws<ArgumentOutOfRangeException>(() => dist.Scale = 0);
Assert.Throws<ArgumentOutOfRangeException>(() => dist.Scale = -78);
Assert.DoesNotThrow(() => dist.Scale = 0.0001);
Assert.DoesNotThrow(() => dist.Scale = 4);
Assert.DoesNotThrow(() => dist.Median = -45);
Assert.DoesNotThrow(() => dist.Median = 15);
Assert.DoesNotThrow(() => dist.Median = 0);
}
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]