простое решение состоит в том, чтобы вернуться к функции и предсказать вероятности нахождения числа:
def generate():
proba = random.random()
max = 0
for i in range(1,M+1):
max += (1/2)**i
if(proba<= max):
return i-1
return generate()
если М мало, распределение не сходится и, следовательно, не все [0,1] являются повторно поддающимися повторению,так что вы просто попробуйте еще раз.
небольшой тест:
M = 10
res = [0 for i in range(M+1)]
for i in range(1000):
res[generate()]+=1
plt.plot([r/1000 for r in res])