Beispiel: unterschiedliche Paare bilden#
Problem: Wir haben n Menschen, z.B n = 100. Wir wollen m
mal je 2 Menschen ins Gespräch bringen, aber nie das gleiche Paar zwei mal.
Außerdem pfelgen wir eine Liste blacklist
, in der schon alle Paare der Vergangenheit gespeichert sind (oder die sich bekanntemaßen nicht gut vertragen). Diese Paare dürfen auch nicht mehr in die Grundgesamtheit der möglichen Paare mit aufgenommen werden.
n = 5 # Anzahl Menschen
m = 3 # gewünschte Anzahl Paare, mit m <= n//2
blacklist = [ (0,1), (1,2), (2,3) ] # Testbeispiel
moegliche_paare = []
for i in range(0,n):
for j in range(i+1,n):
if (i,j) not in blacklist:
moegliche_paare.append( (i,j) )
print(moegliche_paare)
[(0, 2), (0, 3), (0, 4), (1, 3), (1, 4), (2, 4), (3, 4)]
# Oder mit List Comprehension
moegliche_paare = [ (i,j) for i in range(0,n) for j in range(i+1,n) if (i,j) not in blacklist ]
print(moegliche_paare)
[(0, 2), (0, 3), (0, 4), (1, 3), (1, 4), (2, 4), (3, 4)]
Wie viele Elemente hat die Liste moegliche_paare
?
len(moegliche_paare), len(blacklist)
(7, 3)
Wir wählen aus moegliche_paare
einige Paare aus. Dazu lassen wir uns jeweils eine neue Zufallszahl p
aus range(0, len(moegliche_paare))
geben, poppen das Element moegliche_paare[p]
und fügen dieses Paar in unsere Liste der gezogenen Paare ein.
import random
# https://python.readthedocs.io/en/stable/library/random.html#functions-for-integers
# Beispiel:
random.randrange(0, n)
1
Die folgende Schleife kann man mehrfach ausführen:
m = 3
neu_gezogene_paare = []
for i in range(m): # wiederhole m mal
p = random.randrange(0, len(moegliche_paare))
neu_gezogene_paare.append( moegliche_paare.pop(p) ) # https://docs.python.org/3/tutorial/datastructures.html
blacklist.extend(neu_gezogene_paare)
print(f"{neu_gezogene_paare=}\nneue {blacklist=}\n{len(moegliche_paare)=}")
neu_gezogene_paare=[(1, 3), (3, 4), (0, 4)]
neue blacklist=[(0, 1), (1, 2), (2, 3), (1, 3), (3, 4), (0, 4)]
len(moegliche_paare)=4
print(f"{neu_gezogene_paare=}\nneue {blacklist=}\n{len(moegliche_paare)=}")
neu_gezogene_paare=[(1, 3), (3, 4), (0, 4)]
neue blacklist=[(0, 1), (1, 2), (2, 3), (1, 3), (3, 4), (0, 4)]
len(moegliche_paare)=4