Fluent Random Picker is a nice, performant, fluent way to pick random values. Probabilities can be specified, values can be weighted.
$ dotnet add package FluentRandomPicker![]()
Fluent Random Picker is a nice, performant fluent way to pick random values. Probabilities can be specified, values can be weighted.
Fluent Random Picker uses .Net Standard 2.0. That means, it can be used in projects with the following target frameworks:
Install the nuget package (https://www.nuget.org/packages/FluentRandomPicker/)
Add the using directive:
using FluentRandomPicker;Begin with Out.Of() (see the examples).
Out.Of()...var randomNumber = Out.Of().Value(5).AndValue(6).PickOne();
// randomNumber is 5 or 6 with equal probability.var randomChar = Out.Of()
.Value('a').WithPercentage(70)
.AndValue('b').WithPercentage(30)
.PickOne();
// or
var randomChar = Out.Of().Values(new List<char> { 'a', 'b' })
.WithPercentages(70, 30)
.PickOne();
// or
var randomChar = Out.Of().Values(new List<char> { 'a', 'b' })
.WithPercentages(new List<int> { 70, 30 })
.PickOne();
// randomChar is 'a' with a probability of 70 % and 'b' with a probability of 30 %.var randomString = Out.Of()
.Value("hello").WithWeight(2)
.AndValue("world").WithWeight(3)
.PickOne();
// or
var randomChar = Out.Of().Values(new HashSet<string> { "hello", "world" })
.WithWeights(2, 3)
.PickOne();
// or
var randomChar = Out.Of().Values(new HashSet<string> { "hello", "world" })
.WithWeights(new List<int> { 2, 3 })
.PickOne();
// randomString is "hello" or "world", but the probability for "world" is 1.5 times as high.var randomInts = Out.Of()
.Value(1).WithPercentage(80)
.AndValue(10).WithPercentage(10)
.AndValue(100).WithPercentage(5)
.AndValue(1000).WithPercentage(5)
.Pick(5);
// randomInts can be [1, 1, 1, 1, 1] with a higher probability or [1, 1, 100, 10, 1]
// or even [1000, 1000, 1000, 1000, 1000] with a very small probability.var randomInts = Out.Of()
.Values(new List<int> { 1, 10, 100, 1000 })
.WithPercentages(70, 15, 10, 5)
.PickDistinct(2);
// randomInts can be [1, 10], [1, 100], [1, 1000] ... but not [1, 1], [10, 10], ...var randomChar = Out.Of()
.Value('a').WithPercentage(80)
.AndValue('b') // no percentage
.AndValue('c') // no percentage
.PickOne();
// The missing percentages to reach 100% are equally distributed on the values without specified percentages.
// Attention! The missing percentages to reach 100% must be divisible without remainder through the number of values without percentages.
// randomChar is 'a' with a probability of 80% or 'b' or 'c' with a probability of each 10%.var randomString = Out.Of()
.Value("hello").WithWeight(4)
.AndValue("world") // no weight
.PickOne();
// The default weight is 1.
// randomString is "hello" with a probability of 80% (4 of 5) and "world" with a probability of 20% (1 of 5).var operation = Out.Of<Func<long, long>>()
.Value(i => i + 2)
.AndValue(i => i * 2)
.AndValue(i => (long)Math.Pow(i, 2))
.AndValue(i => (long)Math.Pow(i, i))
.PickOne();
var result = operation(10);
// result equals 10 + 2 or 10 * 2 or 10^2 or 10^10. var seed = 1234567;
var value1 = Out.Of(seed).Values(new[] { 1, 2, 3, 4 }).PickOne();
var value2 = Out.Of(seed).Values(new[] { 1, 2, 3, 4 }).PickOne();
// value1 and value2 are always equal.The default random number generator uses System.Random.
Alternative: Using a cryptographically secure implementation that uses System.Security.Cryptography.RandomNumberGenerator:
var secureRng = new FluentRandomPicker.Random.SecureRandomNumberGenerator();
var value = Out.Of(secureRng).Values(new[] { 1, 2, 3, 4 }).PickOne();Alternative: Using own implementation:
public class MyOwnRandomNumberGenerator : IRandomNumberGenerator
{
public double NextDouble()
{
// ...
}
public int NextInt()
{
// ...
}
public int NextInt(int n)
{
// ...
}
public int NextInt(int min, int max)
{
// ...
}
}
var myRng = new MyOwnRandomNumberGenerator();
var value = Out.Of(myRng).Values(new[] { 1, 2, 3, 4 }).PickOne();
// value gets picked via a specified random number generator.The namespace was changed to match coding conventions. Please replace:
using Fluent_Random_Picker;with
using FluentRandomPicker;Some method parameter identifiers do also have changed to match the coding conventions of Microsoft.
The params array is not supported anymore for the Values method. Please replace
Out.Of().Values(1, 2, 3)...with
Out.Of().Value(1).AndValue(2).AndValue(3)...or
Out.Of().Values(new List<int>{ 1, 2, 3 })...Reason: https://github.com/ndsvw/Fluent-Random-Picker/commit/da9af06bda215d0983e428072febed8f33577041