# L219_Llueca

import random as r
'''
len(X) == len(W) > 1
W is transformed such that each elemnt is between 0.0 and 1.0
'''
def select(X,W):
	s = sum(W)
	W = [w / s for w in W]
	f = r.random() #random between 0 and 1
	acum = 0.0
	for i in range(0, len(X)):
		acum = acum + W[i]
		if f <= acum:
			return X[i]
	return 'Something went wrong'


'''
von neuman algorithm
given a biased coin with know bias (b) generates random bits
0.0 < b < 1.0
'''
def von_neumann(b):
	X = ['head', 'tail']
	W = [1-b, b]
	b1 = select(X,W)
	b2 = select(X,W)
	if b1 == b2:
		return von_neumann(b) # repeat until 1 output bit
	else:
		return b1
	return 'Something went wrong'


X = ['a','b','c']
W = [0.3, 0.5, 0.2]
res = [0,0,0]
print("Select:")
for x in range(100000):
	re = select(X,W)
	if re == 'a': 
		res[0] += 1
	elif re == 'b' :
		res[1] += 1
	else:
		res[2] += 1
print(res)

print("Von neumann algorithm")
# von neumann algorithm for extranting random bits from a biased coin
h = 0
t = 0
for x in range(10000):
	re = von_neumann(0.3)
	if re == 'head': h +=1
	else: t += 1
print('heads: ',h,' tails: ',t) 
#print(res)
