Contains a Random Service that provides an IRandomizer abstraction whose contract is equivalent to System.Random.
-
New random number generators based on System.Random:
- ConcurrentPseudoRandom - A random number generator guaranteeing thread safety;
- CryptoRandom - A random number generator based on the System.Security.Cryptography.RNGCryptoServiceProvider.
-
Supported types:
- Int32/Int
- Double
- Byte[]
-
Supported types via extension methods:
- SByte
- Byte
- Int16/Short
- UInt16/UShort
- UInt32/UInt
- Int64/Long
- UInt64/ULong
- Float
- Decimal
- Char[]
- String
- Boolean
- Enum
-
Extensibility (see Depra.Unity.Random);
-
Most of the functionality is covered by unit tests;
-
Also included are benchmarks that may be of interest.
To instantiate a service you need to use the builder pattern.
Instance creation with a custom randomizer:
var randomService = new RandomServiceBuilder()
.With<int>(new CutomIntRandomizer()) // Or another randomizer
.Build(); // for type Int32
Instantiating with a collection of randomizers:
var randomService = new RandomServiceBuilder()
.With(new PseudoRandomizers()) // Or another collection of randomizers.
.Build();
// You can get randomizers from collections working with System.Random in this way:
var intRandomizer = randomService.GetRandomizer(typeof(int))
intRandomizer = randomService.GetNumberRandomizer<int>();
var doubleRandomizer = randomService.GetTypedRandomizer<double>();
var byteArrayRandomizer = randomService.GetArrayRandomizer<byte[]>();
With the help of extension methods for randomizers, you can also get random value types that are not supported through System.Random. An example of getting a random string using INumberRandomizer:
var intRandomizer = randomService.GetNumberRandomizer<int>();
var randUpperCaseString = intRandomizer.NextString(length: 10, includeLowerCase: false);
var randString = intRandomizer.NextString(length: 20, allowedCharacters: "abcdef");
- Depra.Unity.Random - To provide support for UnityEngine.Random.
Some extension methods may not perform well and will be improved in future releases.
Your suggestions for improvements are welcome.