I was searching on google for RNGCryptoServiceProvider with examples on how to limit the range between Max and Min, and still get an even distribution. Before I used modulo oper
You'll want to create your RNGCryptoServiceProvider
object once and then re-use that object every time you want a new random number. For instance, you can either pass said object into your GetRandom()
method or store it in a class-level field.
As far as the RNGCryptoServiceProvider
type itself, it generates good numbers on its own, there's no need to create a Random
object and pass in a seed. This should give you a very decent distribution:
public static int GetRandom(RNGCryptoServiceProvider rngProvider, int min, int max)
{
byte[] b = new byte[sizeof(UInt32)];
rngProvider.GetBytes(b);
double d = BitConverter.ToUInt32(b, 0) / (double)UInt32.MaxValue;
return min + (int)((max - min) * d);
}