Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }