/// <summary> /// Selects a random number between 0 and an upper-bound /// </summary> /// <param name="provider">Random Number Generator to use</param> /// <param name="upperBound">The upper-bound (exclusive) of random number selection</param> /// <returns>A random number between 0 (inclusive) and the given upper-bound (exclusive)</returns> public static int RandomNumber(this IPRNGFortunaProvider provider, int upperBound) { int numBits = PowUpperBound(upperBound); var numBytes = (int)Math.Ceiling(numBits / 8d); var offset = numBits % 8; int retVal; var bytes = new byte[numBytes]; do { provider.GetBytes(bytes); // Now we need to conditionally dispose of any extra bits if (offset != 0) { var bits = new BitArray(bytes); // Truncate (zero-out) high-order bits, if necessary if (BitConverter.IsLittleEndian) { for (var i = bits.Length - 1; i > numBits; i--) { bits.Set(i, false); } } else { for (var i = 0; i < bits.Length - numBits; i++) { bits.Set(i, false); } } var truncatedBytes = new byte[numBytes]; ((ICollection)bits).CopyTo(truncatedBytes, 0); bytes = truncatedBytes; } var prepostFix = Enumerable.Repeat((byte)0, sizeof(int) - bytes.Length); var intBytes = BitConverter.IsLittleEndian ? bytes.Concat(prepostFix) : prepostFix.Concat(bytes); retVal = BitConverter.ToInt32(intBytes.ToArray(), 0); } while (retVal != 0 && retVal >= upperBound); return(Math.Abs(retVal)); }
/// <summary> /// Selects a random number between 0 and an upper-bound /// </summary> /// <param name="provider">Random Number Generator to use</param> /// <param name="upperBound">The upper-bound (exclusive) of random number selection</param> /// <returns>A random number between 0 (inclusive) and the given upper-bound (exclusive)</returns> public static int RandomNumber(this IPRNGFortunaProvider provider, int upperBound) { int numBits = PowUpperBound(upperBound); var numBytes = (int)Math.Ceiling(numBits / 8d); //var offset = numBits % 8; var offset = 8 - numBits % (numBytes * 8); int retVal; var bytes = new byte[numBytes]; do { provider.GetBytes(bytes); // Now we need to conditionally dispose of any extra bits if (offset != 0) { if (BitConverter.IsLittleEndian) { bytes[bytes.Length - 1] = (byte)(bytes[bytes.Length - 1] << offset); bytes[bytes.Length - 1] = (byte)(bytes[bytes.Length - 1] >> offset); } else { bytes[0] = (byte)(bytes[0] >> offset); bytes[0] = (byte)(bytes[0] << offset); } } var prepostFix = Enumerable.Repeat((byte)0, 4 - bytes.Length); var intBytes = BitConverter.IsLittleEndian ? bytes.Concat(prepostFix) : prepostFix.Concat(bytes); retVal = BitConverter.ToInt32(intBytes.ToArray(), 0); } while (retVal != 0 && retVal >= upperBound); return(Math.Abs(retVal)); }
public GamblingModule(GambleConfigFacade configFacade, GambleFacade gambleFacade, IPRNGFortunaProvider provider) { mConfigFacade = configFacade; mGambleFacade = gambleFacade; mProvider = provider; }