public static long RandomLong(this RandomNumberGenerator random, long min, long max) { EnsureMinLEQMax(ref min, ref max); long numbersInRange = unchecked (max - min + 1); if (numbersInRange < 0) { throw new ArgumentException("Size of range between min and max must be less than or equal to Int64.MaxValue"); } long randomOffset = random.RandomInt64(); if (IsModuloBiased(randomOffset, numbersInRange)) { return(RandomLong(random, min, max)); // Try again TODO recusion is evil } else { return(min + PositiveModuloOrZero(randomOffset, numbersInRange)); } }