29 lines
1.0 KiB
C#
29 lines
1.0 KiB
C#
using System.Security.Cryptography;
|
|
|
|
namespace Tiger.Utils;
|
|
|
|
public static class SafeRandomizer
|
|
{
|
|
private static readonly RandomNumberGenerator Generator = RandomNumberGenerator.Create();
|
|
|
|
public static int Between(int minimumValue, int maximumValue)
|
|
{
|
|
var randomNumber = new byte[1];
|
|
|
|
Generator.GetBytes(randomNumber);
|
|
|
|
var 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.
|
|
var 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
|
|
var range = maximumValue - minimumValue + 1;
|
|
|
|
var randomValueInRange = Math.Floor(multiplier * range);
|
|
|
|
return (int) (minimumValue + randomValueInRange);
|
|
}
|
|
} |