RandN.Core 0.5.0

dotnet add package RandN.Core --version 0.5.0
                    
NuGet\Install-Package RandN.Core -Version 0.5.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="RandN.Core" Version="0.5.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="RandN.Core" Version="0.5.0" />
                    
Directory.Packages.props
<PackageReference Include="RandN.Core" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add RandN.Core --version 0.5.0
                    
#r "nuget: RandN.Core, 0.5.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.
#addin nuget:?package=RandN.Core&version=0.5.0
                    
Install RandN.Core as a Cake Addin
#tool nuget:?package=RandN.Core&version=0.5.0
                    
Install RandN.Core as a Cake Tool

RandN

RandN on NuGet

RandN is a .NET library for random number generation. It aims to rectify deficiencies in System.Random with adaptability and extensibility in mind. RandN is heavily inspired by the design of the Rust crate rand, and aims to maintain some level of compatibility with it.

What's wrong with System.Random?

In short, the algorithm it uses is slow and biased. The API is very rigid and inflexible, and as a result is unsuited for many purposes.

RandN provides a clear and obvious API that is difficult to use incorrectly, unlike the API of System.Random. This is accomplished by clearly separating two concepts; generating randomness with an IRng, and turning that data into something useful with an IDistribution.

Docs

The full documentation is available here.

Usage

Install the RandN package from NuGet for most use cases. If you just want to implement an random number generator (ex. you're publishing a package with a new RNG), instead depend on RandN.Core.

Examples

Creating an RNG

using RandN;

// Creates a cryptographically secure RNG
var rng = StandardRng.Create();

// Creates a non-cryptographically secure RNG that's fast and uses less memory
var insecureRng = SmallRng.Create();

A reproducible RNG can also be created by using an algorithm directly:

using RandN.Rngs;

// Use ThreadLocalRng to seed the RNG - this uses a cryptographically secure
// algorithm, so tight loops won't result in similar seeds
var seeder = ThreadLocalRng.Instance;

// Create the seed (Seeds can also be created manually)
var factory = ChaCha.GetChaCha8Factory();
var seed = factory.CreateSeed(seeder);

// Create the RNG from the seed
var rng = factory.Create(seed);

Getting random numbers

Once you have an RNG, you can either use it directly,

var num = rng.NextUInt32();
var bigNum = rng.NextUInt64();
var buffer = new Byte[1000];
rng.Fill(buffer);

or you can use it to sample a distribution:

Uniform.Int32 distribution = Uniform.NewInclusive(42, 54); // [42 - 54]
int answer = distribution.Sample(rng);

Bernoulli weightedCoin = Bernoulli.FromRatio(8, 10); // 80% chance of true
bool probablyHeads = weightedCoin.Sample(rng);

Shuffling a list is also easy:

var list = new List<Int32>() { 1, 2, 3, 4, 5, 6 };
rng.ShuffleInPlace(list);

Any type implementing IRng can be wrapped with RandomShim, which can be used as a drop-in replacement for Random.

using RandN.Compat;
Random random = RandomShim.Create(rng);
random.Next(2); // returns 0 or 1
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  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 is compatible.  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.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

  • net6.0

    • No dependencies.
  • net8.0

    • No dependencies.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on RandN.Core:

Package Downloads
RandN

RandN is an alternative library for random number generation, designed to replace the standard Random type.

RandN.ChaCha

RandN.ChaCha provides the implementation of ChaCha for RandN, an alternative library for random number generation.

RandN.Pcg32

RandN.Pcg32 provides the implementation of Pcg32 for RandN, an alternative library for random number generation.

RandN.ExtraRngs

RandN.ExtraRngs provides an extra RNG algorithms for RandN, an alternative library for random number generation.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.5.0 282 4/1/2025
0.4.0 24,249 4/4/2023
0.4.0-alpha1 186 4/3/2023
0.3.0 32,468 6/20/2021
0.2.0 7,411 12/21/2020
0.1.0 4,660 6/20/2020
0.1.0-beta 665 6/15/2020

Version 0.5.0

     Added .NET 8 target
     (Breaking Change) Dropped .NET Core 3.1 and .NET 7 targets
     Fixed failure to use intrinsics for bitwise-operations when available
     (Breaking Change) Removed Big-Endian support