Skip to content

Instantly share code, notes, and snippets.

@Plus1XP
Created April 13, 2019 17:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Plus1XP/34a249d328b85a03132d9116ca3b3020 to your computer and use it in GitHub Desktop.
Save Plus1XP/34a249d328b85a03132d9116ca3b3020 to your computer and use it in GitHub Desktop.
This method uses an instance of an encryption class (RNGCryptoServiceProvider). This class is better at not following a pattern when it creates random numbers.
public static class RandomNumberGenerator
{
private static readonly RNGCryptoServiceProvider _generator = new RNGCryptoServiceProvider();
public static int NumberBetween(int minimumValue, int maximumValue)
{
byte[] randomNumber = new byte[1];
_generator.GetBytes(randomNumber);
double asciiValueOfRandomCharacter = Convert.ToDouble(randomNumber[0]);
// We are using Math.Max, and substracting 0.00000000001,
// to ensure "multiplier" will always be between 0.0 and .99999999999
// Otherwise, it's possible for it to be "1", which causes problems in our rounding.
double multiplier = Math.Max(0, (asciiValueOfRandomCharacter / 255d) - 0.00000000001d);
// We need to add one to the range, to allow for the rounding done with Math.Floor
int range = maximumValue - minimumValue + 1;
double randomValueInRange = Math.Floor(multiplier * range);
return (int)(minimumValue + randomValueInRange);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment