Veel problemen in kansrekening maken gebruik van het begrip "urne". Dit is een ongeordende verzameling van objecten, waaruit typisch 1 of meerdere objecten gekozen worden, al dan niet met terugleggen. In deze opdracht bouwen we een klasse "Urne" om dergelijke problemen makkelijk te kunnen programmeren. De objecten die in de urne steken, hebben allen een kenmerk (b.v. gekleurde balletjes, genummerde briefjes, ...). Deze kenmerken (de kleuren van de balletjes, of de nummers van de briefjes) worden bij constructie aan een object van de klasse Urne meegegeven, zodat de Urne enkel objecten met dit kenmerk kan hebben. Om de klasse Urne makkelijk te realiseren, houd je de inhoud van de Urne via een woordenboek bij: de sleutels zijn hierbij de kenmerken van de objecten in de Urne, en de waarden het aantal objecten met dit bepaald kenmerk aanwezig zijn.
['rood', 'groen', 'blauw']
door (volgorde is willekeurig). Het woordenboek dat vlak na constructie de inhoud van de Urne
bijhoudt, luidt dan {'groen':0, 'rood':0, 'blauw':0}
.
een constructor, met als argument een lijst van strings. Deze lijst legt de kenmerken van de objecten in de Urne vast
de methode __str__()
levert de standaardstringgedaante voor het woordenboek dat de inhoud van de Urne voorstelt, namelijk koppels
kenmerk:[spatie]aantal
, gescheiden door ,[spatie]
en het geheel omsloten door accolades. Hierbij zorg je ervoor dat in de stringgedaante
de volgorde van de sleutels opklimmend alfabetisch is (maak gebruik van de functie sorted()
).
de operator +=
: het rechteroperand is een tuple, bestaande uit een string en een natuurlijk getal $$n \ge 0$$. De string
stelt het kenmerk voor van het toe te voegen object. Indien het om een kenmerk gaat dat toegelaten wordt in de Urne (m.a.w. het kenmerk werd bij
constructie doorgegeven), dan worden $$n$$ objecten met dit kenmerk toegevoegd aan de Urne.
de operator +
: deze operator stelt het samenvoegen van twee Urnen in een derde urne voor. Het resultaat van deze operator is een nieuwe
Urne, waarin alle objecten toegelaten worden met een kenmerk uit de ene of de andere Urne. Het aantal objecten van een bepaald kenmerk vind je door de
som te nemen van de objecten met dit kenmerk in de beide Urnen. Na toepassing van de operator, worden de beide argument-urnen leeg gemaakt (de objecten
zijn immers verhuisd naar een nieuwe Urne).
de methode lijst()
: deze methode levert een lijst-versie van de inhoud van de Urne op, als lijst van strings.
Hierbij loop je alle sleutels van het woordenboek af, in alfabetische volgorde. Voor elk kenmerk voeg je evenveel elementen aan de lijst toe, als het woordenboek aangeeft.
de methode kies_met_terugleggen()
: deze methode kiest een willekeurig element uit de Urne. Hierbij ga je als volg tewerk:
random.randint()
de methode kies_zonder_terugleggen()
: deze methode kiest een willekeurig element uit de Urne, en verwijdert dit object ook uit de Urne. Hierbij ga je als volg tewerk:
random.randint()
random.seed(100) u0 = Urne(['rood', 'groen', 'blauw']) u0 += ('groen', 3) u0 += ('blauw', 2) print(u0) #{'blauw': 2, 'groen': 3, 'rood': 0} u0 += ('geel', 4) u0 += ('groen', 1) u0 += ('rood', 5) print(u0) #{'blauw': 2, 'groen': 4, 'rood': 5} u1 = Urne(['geel', 'rood']) u1 += ('geel', 5) u1 += ('rood', 3) print(u1) #{'geel': 5, 'rood': 3} som = u0 + u1 print(som) #{'blauw': 2, 'geel': 5, 'groen': 4, 'rood': 8} print(u0) #{'blauw': 0, 'groen': 0, 'rood': 0} print(u1) #{'geel': 0, 'rood': 0} u2 = Urne(['rood', 'geel', 'groen']) u2 += ('rood', 5) u2 += ('geel', 2) u2 += ('groen', 3) print(u2.lijst()) #['geel', 'geel', 'groen', 'groen', 'groen', 'rood', 'rood', 'rood', 'rood', 'rood'] print(u2.kies_met_terugleggen()) #('groen', 2) print(u2) #{'geel': 2, 'rood': 5, 'groen': 3} print(u2.kies_met_terugleggen()) #('rood', 7) print(u2) #{'geel': 2, 'rood': 5, 'groen': 3} print(u2.kies_zonder_terugleggen()) #('rood', 7) print(u2) #{'geel': 2, 'rood': 5, 'groen': 2} print(u2.kies_zonder_terugleggen()) #('groen', 2) print(u2) #{'geel': 2, 'groen': 2, 'rood': 4}