Refactored
This commit is contained in:
parent
dad5ead650
commit
c007c6aef0
@ -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)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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)]
|
||||||
|
Loading…
Reference in New Issue
Block a user