public static BigInteger Random(this Random generator, BigInteger limit) {
ContractUtils.Requires(limit.Sign > 0, "limit");
ContractUtils.RequiresNotNull(generator, "generator");
// TODO: this doesn't yield a uniform distribution (small numbers will be picked more frequently):
uint[] result = new uint[limit.GetWordCount() + 1];
for (int i = 0; i < result.Length; i++) {
result[i] = unchecked((uint)generator.Next());
}
return new BigInteger(1, result) % limit;
}
#else