![]() |
VOOZH | about |
dotnet add package RandN.Core --version 0.5.0
NuGet\Install-Package RandN.Core -Version 0.5.0
<PackageReference Include="RandN.Core" Version="0.5.0" />
<PackageVersion Include="RandN.Core" Version="0.5.0" />Directory.Packages.props
<PackageReference Include="RandN.Core" />Project file
paket add RandN.Core --version 0.5.0
#r "nuget: RandN.Core, 0.5.0"
#:package RandN.Core@0.5.0
#addin nuget:?package=RandN.Core&version=0.5.0Install as a Cake Addin
#tool nuget:?package=RandN.Core&version=0.5.0Install as a Cake Tool
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.
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.
The full documentation is available here.
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.
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);
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 | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 is compatible. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 was computed. |
| .NET Framework | net461 net461 was computed. net462 net462 was computed. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
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.Pcg32
RandN.Pcg32 provides the implementation of Pcg32 for RandN, an alternative library for random number generation. |
|
|
RandN.ChaCha
RandN.ChaCha provides the implementation of ChaCha 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. |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.5.0 | 23,966 | 4/1/2025 |
| 0.4.0 | 29,373 | 4/4/2023 |
| 0.4.0-alpha1 | 341 | 4/3/2023 |
| 0.3.0 | 36,116 | 6/20/2021 |
| 0.2.0 | 7,656 | 12/21/2020 |
| 0.1.0 | 4,905 | 6/20/2020 |
| 0.1.0-beta | 937 | 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