Added a shape fitter
This commit is contained in:
parent
5d2cc1b29c
commit
4b8723d194
43
FastRng/Double/ShapeFitter.cs
Normal file
43
FastRng/Double/ShapeFitter.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FastRng.Double
|
||||
{
|
||||
public sealed class ShapeFitter
|
||||
{
|
||||
private readonly double[] probabilities;
|
||||
private readonly double[] samples;
|
||||
private readonly IRandom rng;
|
||||
private readonly ushort sampleSize;
|
||||
|
||||
public ShapeFitter(Func<double, double> shapeFunction, IRandom rng, ushort sampleSize = 100)
|
||||
{
|
||||
this.rng = rng;
|
||||
this.sampleSize = sampleSize;
|
||||
this.samples = new double[sampleSize];
|
||||
this.probabilities = new double[sampleSize];
|
||||
|
||||
var sampleStepSize = 1.0 / sampleSize;
|
||||
var nextStep = 0.0 + sampleStepSize;
|
||||
for (var n = 0; n < sampleSize; n++)
|
||||
{
|
||||
this.probabilities[n] = shapeFunction(nextStep);
|
||||
nextStep += sampleStepSize;
|
||||
}
|
||||
}
|
||||
|
||||
public async ValueTask<double> NextNumber()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
var nextNumber = await this.rng.GetUniform();
|
||||
var nextBucket = (int)Math.Floor(nextNumber * this.sampleSize);
|
||||
this.samples[nextBucket] += this.probabilities[nextBucket];
|
||||
|
||||
if (this.samples[nextBucket] >= 1.0)
|
||||
return nextNumber;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user