public double Draw() { var idx = 0; BitArray bits = new BitArray(32); while (idx < 32) { var bit = _coins.GetCoin(); bits.Set(idx, bit); idx += 1; } long o = 0; var sum = 0; foreach (bool bit in bits) { long bitVal = bit ? 1 : 0; sum += (int)bitVal; o = (o << 1) | bitVal; } var res = 1.0 * o / (Math.Pow(2, 32) - 1); if (res <= 0 || res > 1) { throw new ArgumentOutOfRangeException(); } return(res); }
internal static long SampleUniform(ValueRange valueRange, CoinFlipper coins) { var currentRange = valueRange.Copy(); if (currentRange.Size() == 0) { throw new Exception(""); } while (currentRange.Size() > 1) { var mid = (currentRange.Start + currentRange.End) / 2; var bit = coins.GetCoin(); if (bit) { currentRange.Start = mid + 1; } else { currentRange.End = mid; } } return(currentRange.Start); }