Willekeurigheid is overal om ons heen. Als je een munt omdraait of een dobbelsteen gooit, kun je nooit zeker zijn van het uiteindelijke resultaat. Deze onvoorspelbaarheid heeft veel toepassingen, zoals het bepalen van de winnaars van een loting of het genereren van testcases voor een experiment met willekeurige waarden die zijn geproduceerd op basis van een algoritme.
Met dit nut in gedachten heeft Python ons de willekeurige module verschaft. Je kunt het in games gebruiken om vijanden willekeurig te laten spawnen of om de elementen in een lijst in willekeurige volgorde te spelen.
Bijna alle functies in deze module zijn afhankelijk van de basis willekeurig()
functie, die een willekeurige float zal genereren groter dan of gelijk aan nul en minder dan één. Python gebruikt de Mersenne Twister om de drijvers te genereren. Het produceert 53-bits precisie-drijvers met een periode van 2 ** 19937-1. Het is eigenlijk de meest gebruikte pseudo-willekeurige nummergenerator voor algemene doeleinden.
Soms wilt u dat de generator van willekeurige getallen de reeks getallen die hij de eerste keer heeft gemaakt, weergeeft. Dit kan worden bereikt door beide zaadwaarden beide keren aan de generator te leveren met behulp van de zaad (s, versie)
functie. Als de parameter s wordt weggelaten, gebruikt de generator de huidige systeemtijd om de nummers te genereren. Hier is een voorbeeld:
import random.seed (100) random.random () # geeft als resultaat 0.1456692551041303 random.random () # geeft 0.45492700451402135 terug
Houd in gedachten dat de module, in tegenstelling tot een coin flip, pseudo-willekeurige getallen genereert die volledig deterministisch zijn, dus het is niet geschikt voor cryptografische doeleinden.
De module heeft twee verschillende functies voor het genereren van willekeurige gehele getallen. Je kunt gebruiken randrange (a)
om een willekeurig geheel getal te genereren dat kleiner is dan een
.
Op dezelfde manier kunt u gebruiken randrange (a, b [, step])
om een willekeurig nummer te genereren van bereik (a, b, stap)
. Gebruik bijvoorbeeld random.randrange (0, 100, 3)
retourneert alleen die getallen tussen 0 en 100 die ook deelbaar zijn door 3.
Als u zowel de onder- als bovengrens kent waartussen u de getallen wilt genereren, kunt u een eenvoudigere en meer intuïtieve functie gebruiken: randint (a, b)
. Het is eenvoudig een alias voor randrange (a, b + 1)
.
import random random.randrange (100) # retourneert 65 random.randrange (100) # geeft 98 random.randrange (0, 100, 3) # retourneert 33 random.randrange (0, 100, 3) # retourneert 75 random.randint ( 1,6) # retourneert 4 random.randint (1,6) # retourneert 6
Om een willekeurig element uit een gegeven niet-lege reeks te selecteren, kunt u de keuze (volgende)
functie. Met randInt ()
, je bent beperkt tot een selectie van nummers uit een bepaald bereik. De keuze (volgende)
Met de functie kunt u een nummer kiezen uit elke gewenste reeks.
Een ander voordeel van deze functie is dat deze niet beperkt is tot alleen getallen. Het kan elk type element willekeurig uit een reeks selecteren. Bijvoorbeeld, de naam van de winnaar van een gelukkige trekking onder vijf verschillende mensen, verstrekt als een string, kan eenvoudig met deze functie worden bepaald.
Als u een reeks in willekeurige volgorde wilt afspelen in plaats van er een willekeurig element uit te selecteren, kunt u de shuffle (volgende)
functie. Dit zal resulteren in een op zijn plaats schuifelen van de reeks. Voor een reeks met slechts 10 (n) elementen kunnen er in totaal 3628800 (n!) Verschillende arrangementen zijn. Met een grotere reeks, zal het aantal mogelijke permutaties zelfs nog hoger zijn - dit betekent dat de functie nooit alle permutaties van een grote reeks kan genereren.
Laten we zeggen dat je 50 studenten uit een groep van 100 studenten moet kiezen om op reis te gaan.
Op dit punt, kunt u worden verleid gebruik de keuze (volgende)
functie. Het probleem is dat je het ongeveer 50 keer moet noemen in het beste geval waarin het niet dezelfde student opnieuw kiest.
Een betere oplossing is om de monster (seq, k)
functie. Het geeft een lijst van k unieke elementen uit de gegeven reeks. De oorspronkelijke reeks blijft ongewijzigd. De elementen in de resulterende lijst staan in de selectievolgorde. Als k is groter dan het aantal elementen in de reeks zelf, een ValueError wordt verhoogd.
import random ids = [1, 8, 10, 12, 15, 17, 25] random.choice (ids) # geeft 8 random terug .choice (ids) # geeft 15 namen terug = ['Tom', 'Harry', 'Andrew ',' Robert '] random.choice (names) # geeft Tom random.choice (namen) # geeft Robert terug random.shuffle (namen) # returns [' Robert ',' Andrew ',' Tom ',' Harry '] random.sample (names, 2) # returns ['Andrew', 'Robert'] random.sample (names, 2) # returns ['Tom', 'Robert'] names # returns ['Robert', 'Andrew', 'Tom', 'Harry']
Zoals je kunt zien, shuffle (volgende)
de oorspronkelijke lijst gewijzigd, maar monster (seq, k)
hield het intact.
In deze sectie leert u over functies die kunnen worden gebruikt om willekeurige getallen te genereren op basis van specifieke real-value distributies. De parameters van de meeste van deze functies zijn genoemd naar de overeenkomstige variabele in de feitelijke vergelijking van die verdeling.
Als u alleen een getal tussen 0 en 1 wilt, kunt u de willekeurig()
functie. Als u wilt dat het nummer binnen een bepaald bereik valt, kunt u de uniform (a, b)
functie met een en b als de lagere en hogere limieten respectievelijk.
Stel dat u een willekeurig getal moet genereren tussen laag en hoog zodanig dat het een grotere kans heeft om in de buurt van een ander nummer te liggen mode. Je kunt dit doen met de driehoekig (laag, hoog, modus)
functie. De laag en hoog waarden zijn standaard 0 en 1. Evenzo is de mode waarde wordt standaard ingesteld op het midden van de lage en hoge waarde, wat resulteert in een symmetrische verdeling.
Er zijn ook veel andere functies om willekeurige getallen te genereren op basis van verschillende distributies. Als voorbeeld kunt u gebruiken normalvariate (mu, sigma)
om een willekeurig nummer te genereren op basis van een normale verdeling, met mu als gemiddelde en sigma als standaardafwijking.
import random random.random () # retourneert 0.8053547502449923 random.random () # retourneert 0.05966180559620815 random.unom (1, 20) # retourneert 11.970525425108205 random.uniform (1, 20) # retourneert 7.731292430291898 random.undular (1, 100, 80) # retourneert 42.328674062298816 random.triangular (1, 100, 80) # geeft 73.54693076132074 als resultaat
Zoals we zojuist zagen, is het mogelijk om willekeurige getallen te genereren met een uniforme verdeling en ook driehoekige of normale verdeling. Zelfs in een eindig bereik zoals 0 tot 100 zijn er oneindig veel drijvers die kunnen worden gegenereerd. Wat als er een eindige verzameling elementen is en u meer gewicht wilt toevoegen aan bepaalde specifieke waarden bij het selecteren van een willekeurig getal? Deze situatie is gebruikelijk in loterijsystemen waar getallen met weinig beloning een hoge wegingsfactor krijgen.
Als het acceptabel is voor uw toepassing om gewichten te hebben die gehele getallen zijn, kunt u een lijst maken met elementen waarvan de frequentie afhangt van hun gewicht. U kunt dan de keuze (volgende)
functie om willekeurig een element uit deze gewogen lijst te selecteren. Hier is een voorbeeld dat de selectie van een prijzenbedrag willekeurig toont.
import random w_prizes = [('$ 1', 300), ('$ 2', 50), ('$ 10', 5), ('$ 100', 1)] prize_list = [prijs voor prijs, gewicht in w_prizes voor i in bereik (gewicht)] random.choice (prijslijst) # retourneert '$ 1'
In mijn geval duurde het tien keer om een prijs van $ 2 te krijgen die uit de lijst was gekozen. De kans op een prijs van $ 100 zou veel lager zijn. Op dezelfde manier kunt u ook vooroordelen toevoegen aan andere dergelijke programma's.
Deze module kan in veel situaties nuttig zijn, zoals het schudden van de vragen in een opdracht of het genereren van willekeurige gebruikersnamen of wachtwoorden voor uw gebruikers met behulp van de shuffle ()
functie. U kunt ook willekeurige getallen uniform genereren en een weging geven aan getallen in een specifiek bereik. In onze volgende tutorial zullen we de functies van deze module gebruiken om willekeurige gegevens voor statistische analyse te genereren.
Heb je een aantal interessante toepassingen van random number-generatoren in gedachten die nuttig kunnen zijn voor andere lezers? Laat het ons weten in de comments.