private static uint Adjust(IUniformRandomBitGenerator generator, uint upperBoundary) { if (generator == null) { throw new ArgumentNullException(nameof(generator)); } if (upperBoundary == 0) { return(0); } if (upperBoundary == uint.MaxValue) { return(generator.Next32Bits()); } ++upperBoundary; var numBuckets = ulong.MaxValue / upperBoundary; var limit = numBuckets * upperBoundary; ulong sample; do { sample = generator.Next64Bits(); }while (sample >= limit); return((uint)(sample / numBuckets)); }
public static int Next(IUniformRandomBitGenerator generator, int lowerBound, int upperBound) => (int)Adjust(generator, (uint)(upperBound - lowerBound)) + lowerBound;
public static double Next(IUniformRandomBitGenerator generator) { var entropy = mMask | (generator.Next64Bits() >> 12); return(BitConverter.Int64BitsToDouble((long)entropy) - 1.0); }
public int NextInt(IUniformRandomBitGenerator generator) => (int)Adjust(Generator, Delta) + LowerBound;
public double NextDouble(IUniformRandomBitGenerator generator) => Next(generator);