import random
def bingo():
for number in randomly_ordered_range(1, 76):
input("Press ENTER to draw a number")
print(number)
def randomly_ordered_range(start, end):
"""Return a generator with the values in range(start, end), but in random
order.
"""
if start >= end:
raise ValueError(f"requires start < end, got start={start}, end={end}")
numbers = list(range(start, end))
length = len(numbers)
for i in range(0, length):
j = random.randint(i, length - 1)
numbers[i], numbers[j] = numbers[j], numbers[i]
yield numbers[i]
if __name__ == "__main__":
bingo()
Det är en liten tvist på Fisher-Yates Shuffle här: vi kör så att `i` faktiskt antar värdet av sista indexet i arrayen, nämligen `length - 1`. Detta är ur skyfflingsperspektiv helt onödigt då `random.randint(length - 1, length - 1)` givetvis bara kan bli `length - 1` så att swappen på andra raden i loopen blir en noop (i == j). Vi gör detta enbart för att enkelt kunna yielda sista värdet i listan.