Added documentation
This commit is contained in:
parent
afcd2f3dc8
commit
37e846233d
@ -5,8 +5,20 @@ using FastRng.Double.Distributions;
|
|||||||
|
|
||||||
namespace FastRng.Double
|
namespace FastRng.Double
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interface for random number generators.
|
||||||
|
/// </summary>
|
||||||
public interface IRandom : IDisposable
|
public interface IRandom : IDisposable
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a uniform distributed pseudo-random number from the interval (0,1].
|
||||||
|
/// This means, the result 0 is impossible, whereas 1 is possible.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This method is thread-safe. You can consume numbers from the same generator
|
||||||
|
/// by using multiple threads at the same time.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="cancel">An optional cancellation token.</param>
|
||||||
public ValueTask<double> GetUniform(CancellationToken cancel = default);
|
public ValueTask<double> GetUniform(CancellationToken cancel = default);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,11 +2,18 @@ using System;
|
|||||||
|
|
||||||
namespace FastRng.Double
|
namespace FastRng.Double
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides some mathematical function, which are not available within in the .NET framework.
|
||||||
|
/// </summary>
|
||||||
public static class MathTools
|
public static class MathTools
|
||||||
{
|
{
|
||||||
private static readonly double SQRT_2 = Math.Sqrt(2.0);
|
private static readonly double SQRT_2 = Math.Sqrt(2.0);
|
||||||
private static readonly double SQRT_PI = Math.Sqrt(Math.PI);
|
private static readonly double SQRT_PI = Math.Sqrt(Math.PI);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mathematical gamma function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="z">The value for which you want calculate gamma.</param>
|
||||||
public static double Gamma(double z)
|
public static double Gamma(double z)
|
||||||
{
|
{
|
||||||
// Source: http://rosettacode.org/wiki/Gamma_function#Go
|
// Source: http://rosettacode.org/wiki/Gamma_function#Go
|
||||||
@ -36,8 +43,17 @@ namespace FastRng.Double
|
|||||||
return MathTools.SQRT_2 * MathTools.SQRT_PI * Math.Pow(t, z - 0.5) * Math.Exp(-t) * x;
|
return MathTools.SQRT_2 * MathTools.SQRT_PI * Math.Pow(t, z - 0.5) * Math.Exp(-t) * x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mathematical factorial function for floating-point numbers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value, for which you want to know the factorial.</param>
|
||||||
public static double Factorial(double x) => MathTools.Gamma(x + 1.0);
|
public static double Factorial(double x) => MathTools.Gamma(x + 1.0);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mathematical factorial function for integer numbers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value, for which you want to know the factorial.</param>
|
||||||
|
/// <exception cref="ArgumentOutOfRangeException">Throws, when x is greater than 20. Due to limitations of 64bit ulong type.</exception>
|
||||||
public static ulong Factorial(uint x)
|
public static ulong Factorial(uint x)
|
||||||
{
|
{
|
||||||
if (x > 20)
|
if (x > 20)
|
||||||
@ -50,6 +66,12 @@ namespace FastRng.Double
|
|||||||
return accumulator;
|
return accumulator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mathematical factorial function for integer numbers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value, for which you want to know the factorial.</param>
|
||||||
|
/// <exception cref="ArgumentOutOfRangeException">Throws, when x is greater than 20. Due to limitations
|
||||||
|
/// of 64bit ulong type. Throws also, when x is less than 0.</exception>
|
||||||
public static ulong Factorial(int x)
|
public static ulong Factorial(int x)
|
||||||
{
|
{
|
||||||
if(x < 0)
|
if(x < 0)
|
||||||
|
@ -68,6 +68,15 @@ namespace FastRng.Double
|
|||||||
|
|
||||||
#region Constructors
|
#region Constructors
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a multi-threaded random number generator.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This constructor uses the user's current local time
|
||||||
|
/// to derive necessary parameters for the generator.
|
||||||
|
/// Thus, the results are depending on the time, where
|
||||||
|
/// the generator was created.
|
||||||
|
/// </remarks>
|
||||||
public MultiThreadedRng()
|
public MultiThreadedRng()
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@ -81,6 +90,19 @@ namespace FastRng.Double
|
|||||||
this.StartProducerThreads();
|
this.StartProducerThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a multi-threaded random number generator.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// A multi-threaded random number generator created by this constructor is
|
||||||
|
/// deterministic. It's behaviour is not depending on the time of its creation.<br/><br/>
|
||||||
|
///
|
||||||
|
/// <b>Please note:</b> Although the number generator and all distributions are deterministic,
|
||||||
|
/// the behavior of the consuming application might be non-deterministic. This is possible if
|
||||||
|
/// the application with multiple threads consumes the numbers. The scheduling of the threads
|
||||||
|
/// is up to the operating system and might not be predictable.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="seedU">A seed value to generate a deterministic generator.</param>
|
||||||
public MultiThreadedRng(uint seedU)
|
public MultiThreadedRng(uint seedU)
|
||||||
{
|
{
|
||||||
this.mW = seedU;
|
this.mW = seedU;
|
||||||
@ -88,6 +110,20 @@ namespace FastRng.Double
|
|||||||
this.StartProducerThreads();
|
this.StartProducerThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a multi-threaded random number generator.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// A multi-threaded random number generator created by this constructor is
|
||||||
|
/// deterministic. It's behaviour is not depending on the time of its creation.<br/><br/>
|
||||||
|
///
|
||||||
|
/// <b>Please note:</b> Although the number generator and all distributions are deterministic,
|
||||||
|
/// the behavior of the consuming application might be non-deterministic. This is possible if
|
||||||
|
/// the application with multiple threads consumes the numbers. The scheduling of the threads
|
||||||
|
/// is up to the operating system and might not be predictable.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="seedU">The first seed value.</param>
|
||||||
|
/// <param name="seedV">The second seed value.</param>
|
||||||
public MultiThreadedRng(uint seedU, uint seedV)
|
public MultiThreadedRng(uint seedU, uint seedV)
|
||||||
{
|
{
|
||||||
this.mW = seedU;
|
this.mW = seedU;
|
||||||
@ -209,6 +245,15 @@ namespace FastRng.Double
|
|||||||
|
|
||||||
#region Implementing interface
|
#region Implementing interface
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a uniform distributed pseudo-random number from the interval (0,1].
|
||||||
|
/// This means, the result 0 is impossible, whereas 1 is possible.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This method is thread-safe. You can consume numbers from the same generator
|
||||||
|
/// by using multiple threads at the same time.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="cancel">An optional cancellation token.</param>
|
||||||
public async ValueTask<double> GetUniform(CancellationToken cancel = default)
|
public async ValueTask<double> GetUniform(CancellationToken cancel = default)
|
||||||
{
|
{
|
||||||
while (!cancel.IsCancellationRequested)
|
while (!cancel.IsCancellationRequested)
|
||||||
@ -301,6 +346,11 @@ namespace FastRng.Double
|
|||||||
|
|
||||||
private void StopProducer() => this.producerTokenSource.Cancel();
|
private void StopProducer() => this.producerTokenSource.Cancel();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Disposes this generator. It is important to dispose a generator,
|
||||||
|
/// when it is no longer needed. Otherwise, the background threads
|
||||||
|
/// are still running.
|
||||||
|
/// </summary>
|
||||||
public void Dispose() => this.StopProducer();
|
public void Dispose() => this.StopProducer();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -17,6 +17,12 @@ namespace FastRng.Double
|
|||||||
private readonly double sampleSize;
|
private readonly double sampleSize;
|
||||||
private readonly IDistribution uniform;
|
private readonly IDistribution uniform;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a shape fitter instance.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shapeFunction">The function which describes the desired shape.</param>
|
||||||
|
/// <param name="rng">The random number generator instance to use.</param>
|
||||||
|
/// <param name="sampleSize">The number of sampling steps to sample the given function.</param>
|
||||||
public ShapeFitter(Func<double, double> shapeFunction, IRandom rng, ushort sampleSize = 50)
|
public ShapeFitter(Func<double, double> shapeFunction, IRandom rng, ushort sampleSize = 50)
|
||||||
{
|
{
|
||||||
this.rng = rng;
|
this.rng = rng;
|
||||||
@ -39,6 +45,11 @@ namespace FastRng.Double
|
|||||||
this.max = maxValue;
|
this.max = maxValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random number regarding the given shape.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="token">An optional cancellation token.</param>
|
||||||
|
/// <returns>The next value regarding the given shape.</returns>
|
||||||
public async ValueTask<double> NextNumber(CancellationToken token = default)
|
public async ValueTask<double> NextNumber(CancellationToken token = default)
|
||||||
{
|
{
|
||||||
while (!token.IsCancellationRequested)
|
while (!token.IsCancellationRequested)
|
||||||
|
@ -5,8 +5,20 @@ using FastRng.Float.Distributions;
|
|||||||
|
|
||||||
namespace FastRng.Float
|
namespace FastRng.Float
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interface for random number generators.
|
||||||
|
/// </summary>
|
||||||
public interface IRandom : IDisposable
|
public interface IRandom : IDisposable
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a uniform distributed pseudo-random number from the interval (0,1].
|
||||||
|
/// This means, the result 0 is impossible, whereas 1 is possible.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This method is thread-safe. You can consume numbers from the same generator
|
||||||
|
/// by using multiple threads at the same time.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="cancel">An optional cancellation token.</param>
|
||||||
public ValueTask<float> GetUniform(CancellationToken cancel = default);
|
public ValueTask<float> GetUniform(CancellationToken cancel = default);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,11 +2,18 @@ using System;
|
|||||||
|
|
||||||
namespace FastRng.Float
|
namespace FastRng.Float
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Provides some mathematical function, which are not available within in the .NET framework.
|
||||||
|
/// </summary>
|
||||||
public static class MathTools
|
public static class MathTools
|
||||||
{
|
{
|
||||||
private static readonly float SQRT_2 = MathF.Sqrt(2.0f);
|
private static readonly float SQRT_2 = MathF.Sqrt(2.0f);
|
||||||
private static readonly float SQRT_PI = MathF.Sqrt(MathF.PI);
|
private static readonly float SQRT_PI = MathF.Sqrt(MathF.PI);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mathematical gamma function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="z">The value for which you want calculate gamma.</param>
|
||||||
public static float Gamma(float z)
|
public static float Gamma(float z)
|
||||||
{
|
{
|
||||||
// Source: http://rosettacode.org/wiki/Gamma_function#Go
|
// Source: http://rosettacode.org/wiki/Gamma_function#Go
|
||||||
@ -36,8 +43,17 @@ namespace FastRng.Float
|
|||||||
return MathTools.SQRT_2 * MathTools.SQRT_PI * MathF.Pow(t, z - 0.5f) * MathF.Exp(-t) * x;
|
return MathTools.SQRT_2 * MathTools.SQRT_PI * MathF.Pow(t, z - 0.5f) * MathF.Exp(-t) * x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mathematical factorial function for floating-point numbers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value, for which you want to know the factorial.</param>
|
||||||
public static float Factorial(float x) => MathTools.Gamma(x + 1.0f);
|
public static float Factorial(float x) => MathTools.Gamma(x + 1.0f);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mathematical factorial function for integer numbers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value, for which you want to know the factorial.</param>
|
||||||
|
/// <exception cref="ArgumentOutOfRangeException">Throws, when x is greater than 20. Due to limitations of 64bit ulong type.</exception>
|
||||||
public static ulong Factorial(uint x)
|
public static ulong Factorial(uint x)
|
||||||
{
|
{
|
||||||
if (x > 20)
|
if (x > 20)
|
||||||
@ -50,6 +66,12 @@ namespace FastRng.Float
|
|||||||
return accumulator;
|
return accumulator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mathematical factorial function for integer numbers.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="x">The value, for which you want to know the factorial.</param>
|
||||||
|
/// <exception cref="ArgumentOutOfRangeException">Throws, when x is greater than 20. Due to limitations
|
||||||
|
/// of 64bit ulong type. Throws also, when x is less than 0.</exception>
|
||||||
public static ulong Factorial(int x)
|
public static ulong Factorial(int x)
|
||||||
{
|
{
|
||||||
if(x < 0)
|
if(x < 0)
|
||||||
|
@ -68,6 +68,15 @@ namespace FastRng.Float
|
|||||||
|
|
||||||
#region Constructors
|
#region Constructors
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a multi-threaded random number generator.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This constructor uses the user's current local time
|
||||||
|
/// to derive necessary parameters for the generator.
|
||||||
|
/// Thus, the results are depending on the time, where
|
||||||
|
/// the generator was created.
|
||||||
|
/// </remarks>
|
||||||
public MultiThreadedRng()
|
public MultiThreadedRng()
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@ -81,6 +90,19 @@ namespace FastRng.Float
|
|||||||
this.StartProducerThreads();
|
this.StartProducerThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a multi-threaded random number generator.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// A multi-threaded random number generator created by this constructor is
|
||||||
|
/// deterministic. It's behaviour is not depending on the time of its creation.<br/><br/>
|
||||||
|
///
|
||||||
|
/// <b>Please note:</b> Although the number generator and all distributions are deterministic,
|
||||||
|
/// the behavior of the consuming application might be non-deterministic. This is possible if
|
||||||
|
/// the application with multiple threads consumes the numbers. The scheduling of the threads
|
||||||
|
/// is up to the operating system and might not be predictable.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="seedU">A seed value to generate a deterministic generator.</param>
|
||||||
public MultiThreadedRng(uint seedU)
|
public MultiThreadedRng(uint seedU)
|
||||||
{
|
{
|
||||||
this.mW = seedU;
|
this.mW = seedU;
|
||||||
@ -88,6 +110,20 @@ namespace FastRng.Float
|
|||||||
this.StartProducerThreads();
|
this.StartProducerThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a multi-threaded random number generator.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// A multi-threaded random number generator created by this constructor is
|
||||||
|
/// deterministic. It's behaviour is not depending on the time of its creation.<br/><br/>
|
||||||
|
///
|
||||||
|
/// <b>Please note:</b> Although the number generator and all distributions are deterministic,
|
||||||
|
/// the behavior of the consuming application might be non-deterministic. This is possible if
|
||||||
|
/// the application with multiple threads consumes the numbers. The scheduling of the threads
|
||||||
|
/// is up to the operating system and might not be predictable.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="seedU">The first seed value.</param>
|
||||||
|
/// <param name="seedV">The second seed value.</param>
|
||||||
public MultiThreadedRng(uint seedU, uint seedV)
|
public MultiThreadedRng(uint seedU, uint seedV)
|
||||||
{
|
{
|
||||||
this.mW = seedU;
|
this.mW = seedU;
|
||||||
@ -209,6 +245,15 @@ namespace FastRng.Float
|
|||||||
|
|
||||||
#region Implementing interface
|
#region Implementing interface
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a uniform distributed pseudo-random number from the interval (0,1].
|
||||||
|
/// This means, the result 0 is impossible, whereas 1 is possible.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This method is thread-safe. You can consume numbers from the same generator
|
||||||
|
/// by using multiple threads at the same time.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="cancel">An optional cancellation token.</param>
|
||||||
public async ValueTask<float> GetUniform(CancellationToken cancel = default)
|
public async ValueTask<float> GetUniform(CancellationToken cancel = default)
|
||||||
{
|
{
|
||||||
while (!cancel.IsCancellationRequested)
|
while (!cancel.IsCancellationRequested)
|
||||||
@ -301,6 +346,11 @@ namespace FastRng.Float
|
|||||||
|
|
||||||
private void StopProducer() => this.producerTokenSource.Cancel();
|
private void StopProducer() => this.producerTokenSource.Cancel();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Disposes this generator. It is important to dispose a generator,
|
||||||
|
/// when it is no longer needed. Otherwise, the background threads
|
||||||
|
/// are still running.
|
||||||
|
/// </summary>
|
||||||
public void Dispose() => this.StopProducer();
|
public void Dispose() => this.StopProducer();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -16,6 +16,12 @@ namespace FastRng.Float
|
|||||||
private readonly float sampleSize;
|
private readonly float sampleSize;
|
||||||
private readonly IDistribution uniform;
|
private readonly IDistribution uniform;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a shape fitter instance.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="shapeFunction">The function which describes the desired shape.</param>
|
||||||
|
/// <param name="rng">The random number generator instance to use.</param>
|
||||||
|
/// <param name="sampleSize">The number of sampling steps to sample the given function.</param>
|
||||||
public ShapeFitter(Func<float, float> shapeFunction, IRandom rng, ushort sampleSize = 50)
|
public ShapeFitter(Func<float, float> shapeFunction, IRandom rng, ushort sampleSize = 50)
|
||||||
{
|
{
|
||||||
this.rng = rng;
|
this.rng = rng;
|
||||||
@ -38,6 +44,11 @@ namespace FastRng.Float
|
|||||||
this.max = maxValue;
|
this.max = maxValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random number regarding the given shape.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="token">An optional cancellation token.</param>
|
||||||
|
/// <returns>The next value regarding the given shape.</returns>
|
||||||
public async ValueTask<float> NextNumber(CancellationToken token = default)
|
public async ValueTask<float> NextNumber(CancellationToken token = default)
|
||||||
{
|
{
|
||||||
while (!token.IsCancellationRequested)
|
while (!token.IsCancellationRequested)
|
||||||
|
Loading…
Reference in New Issue
Block a user