FastRng 1.1.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package FastRng --version 1.1.0                
NuGet\Install-Package FastRng -Version 1.1.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FastRng" Version="1.1.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add FastRng --version 1.1.0                
#r "nuget: FastRng, 1.1.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install FastRng as a Cake Addin
#addin nuget:?package=FastRng&version=1.1.0

// Install FastRng as a Cake Tool
#tool nuget:?package=FastRng&version=1.1.0                

FastRng

FastRng is a multi-threaded pseudo-random number generator. Besides the generation of uniformly distributed random numbers, there are several other distributions to choose from. For performance reasons the parameters of the distributions are not user-definable. For some distributions, therefore, different parameter variations are available. If a different combination is desired, a separate class can be created.

Please note, that Math.NET's (https://www.mathdotnet.com/) random number generator is in some situations faster. Unlike Math.NET, MultiThreadedRng is multi-threaded. Consumers can use a token to cancel e.g. timeout an operation.

FastRng (class MultiThreadedRng) using a shape fitter (a rejection sampler) to enforce arbitrary shapes of probabilities for desired distributions. By using the shape fitter, it is even easy to define discontinuous, arbitrary functions as shapes. Any consumer can define and use own distributions.

The class MultiThreadedRng uses the George Marsaglia's MWC algorithm. The algorithm's implementation based loosely on John D. Cook's (johndcook.com) implementation. Thanks John for the inspiration.

Please notice: When using the debug environment, MultiThreadedRng might uses a smaller buffer size. Please ensure, that the production environment uses a release build, though.

Usage

Example code:

using FastRng.Float;
using FastRng.Float.Distributions;

[...]

using var rng = new MultiThreadedRng<float>();
var dist = new ChiSquareK1<float>(rng);

var value1 = dist.NextNumber();
var value2 = dist.NextNumber(rangeStart: -1.0f, rangeEnd: 1.0f);
if(dist.HasDecisionBeenMade(above: 0.8f, below: 0.9f))
{
    // Decision has been made
}

Notes:

  • MultiThreadedRng and all distributions are using generic math types: you might use float, double, or Half.

  • MultiThreadedRng is IDisposable. It is important to call Dispose, when the generator is not needed anymore. Otherwise, the supporting background threads are still running.

  • MultiThreadedRng fills some buffers after creation. Thus, create and reuse it as long as needed. Avoid useless re-creation.

  • Distributions need some time at creation to calculate probabilities. Thus, just create a distribution once and use reuse it. Avoid useless re-creation.

Available Distributions

Normal Distribution (std. dev.=0.2, mean=0.5)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Normal_distribution

Beta Distribution (alpha=2, beta=2)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Beta_distribution

Beta Distribution (alpha=2, beta=5)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Beta_distribution

Beta Distribution (alpha=5, beta=2)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Beta_distribution

Cauchy / Lorentz Distribution (x0=0)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Cauchy_distribution

Cauchy / Lorentz Distribution (x0=1)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Cauchy_distribution

Chi-Square Distribution (k=1)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Chi-square_distribution

Chi-Square Distribution (k=4)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Chi-square_distribution

Chi-Square Distribution (k=10)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Chi-square_distribution

Exponential Distribution (lambda=5)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Exponential_distribution

Exponential Distribution (lambda=10)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Exponential_distribution

Inverse Exponential Distribution (lambda=5)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Inverse_distribution#Inverse_exponential_distribution

Inverse Exponential Distribution (lambda=10)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Inverse_distribution#Inverse_exponential_distribution

Gamma Distribution (alpha=5, beta=15)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Gamma_distribution

Inverse Gamma Distribution (alpha=3, beta=0.5)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Inverse-gamma_distribution

Laplace Distribution (b=0.1, mu=0)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Laplace_distribution

Laplace Distribution (b=0.1, mu=0.5)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Laplace_distribution

Log-Normal Distribution (sigma=1, mu=0)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Log-normal_distribution

StudentT Distribution (nu=1)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Student%27s_t-distribution

Weibull Distribution (k=0.5, lambda=1)

alternate text is missing from this package README image

Wikipedia: https://en.wikipedia.org/wiki/Weibull_distribution

Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net7.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.2.0 209 5/29/2024
1.1.2 279 11/14/2023
1.1.1 162 10/26/2023
1.1.0 176 7/10/2023
1.0.0 524 11/7/2020