Loading

Abrazolica


Home     Archive     Tags     About        RSS
Turn a Fair Coin Into a Biased Coin

It's fairly easy to simulate a fair coin with a biased coin. See Coin Tossing: the Hydrogen Atom of Probability for a simple way to do it. But how do you turn a fair coin into a biased coin?

If you have a perfectly fair coin, P(H)=P(T)=1/2, you can use it to simulate a biased coin with P(H)=α, P(T)=1α. To see how let's first look at how to do it using a uniform random variable (URV). Let the URV have the following probability density function:

p(x)=10x<1=0otherwise

The cumulative distribution then says that P(x<α)=α and P(xα)=1α. So the process is simple. Generate a random variate with this distribution. If x<α take the result to be H otherwise take it to be T.

You can mimic this process with a fair coin if you let H=0, T=1 and take the result of a toss sequence to be a fractional binary number. For example, the toss sequence HTHTT converts to the fractional binary number .01011 which is equal to the decimal number 1/4+1/16+1/32=11/32=0.34375. If we were using this to simulate a biased coin with P(H)=1/3, P(T)=2/3 then at this point we could stop and output a T since the binary number will always stay above 1/3 no matter what the subsequent tosses are.

Suppose on the other hand that the toss sequence is HTHH which converts to .0100 with decimal value 1/4=0.25. In this case we can stop and output a H since the binary number will always stay below 1/3 no matter what the subsequent tosses are. The same would be true if the toss sequence started as HH. There is no way this can lead to a binary number greater than 1/3 so we can stop and output a H.

This procedure can be used to simulate a biased coin with probability P(H)=α, P(T)=1α. The basic algorithm is as follows. Let x be the probability we want to simulate, and y be the value of the toss sequence converted into a binary number. Then

1  input(x)
2  y = 0
3  i = 1
4  gettoss(t)
5  y = y + t/2^i
6  if y >= x
     output(1)
     goto 2
7  if x > y + 1/2^i
     output(0)
     goto 2
8  i = i + 1
9  goto 4

A C code implementation of this can be found here. It reads a string of 1's and 0's representing a fair coin toss sequence, and converts it into a string of 1's and 0's representing a biased coin with a probability of 0 given on the command line.

Using this program, we took data from the NIST randomness beacon that is supposed to be totally random, i.e. P(0)=P(1)=1/2, and converted it using the C program linked to above to data with bias probabilities from 0.0 through 1.0 in increments of 0.01. For each bias, we took the first 90000 bits and created a 300 by 300 pixel image. All the images were then combined into the animated gif shown below.


© 2010-2019 Stefan Hollos and Richard Hollos

submit to reddit   

blog comments powered by Disqus