Slump & moduler

Koden som aldrig gör samma sak två gånger

Alla program vi skrivit hittills är förutsägbara. Kör du dem tio gånger i rad med samma inmatning får du exakt samma utskrift. Det är användbart, men det är inte spännande. Ett spel utan överraskningar är inget spel.

Python levereras med färdiga Modul En fil med färdig Python-kod, funktioner och värden som någon annan skrivit och samlat ihop. Importeras med import. Se: Slump & Moduler , samlingar av funktioner som någon annan redan skrivit och som du kan använda utan att behöva skriva dem själv. En av dem heter random. Den ger din kod förmågan att fatta oförutsägbara beslut.

Vad import gör

Python kommer med ett Standardbibliotek Samlingen av moduler som levereras med Python, till exempel random, math och time. Inga extra installationer krävs. Se: Slump & Moduler , hundratals färdiga moduler för allt från matematik till nätverkskommunikation. De är redan installerade, men de laddas inte in automatiskt. Du väljer själv vad du behöver:

import random
import math

import placeras alltid längst upp i filen, innan all annan kod. Det är konventionen.

När modulen är inladdad når du dess funktioner med en punkt: random.randint(), math.sqrt(). Punkten talar om att funktionen tillhör den specifika modulen.

random.randint(), tärningen i datorn

Editor

Redo.

Kör flera gånger. Svaret ändras varje gång, det är hela poängen. randint(1, 6) returnerar ett heltal från 1 till och med 6, inklusive båda ändarna.

Det värdet beter sig precis som vilken variabel som helst: du kan lagra det, räkna med det och, som du strax ska se, jämföra det.

Är slumpen på riktigt?

Nej, och det är en av de mer överraskande sakerna med datorer. En dator kan inte hitta på ett tal ur tomma intet. Allt den gör följer instruktioner, och en instruktion som lyder “hitta på något oförutsägbart” är en motsägelse.

Vad random egentligen gör är att räkna. Den utgår från ett startvärde, ofta klockan i den exakta millisekund du startar programmet, och kör det värdet genom en lång kedja av matematiska operationer. Ut kommer tal som fördelar sig jämnt och som ingen kan förutsäga i praktiken. Men de är uträknade, inte påhittade.

Det kallas Pseudoslump Slump som är uträknad i stället för påhittad. Datorn utgår från ett startvärde, ofta klockan, och räknar fram tal som beter sig slumpmässigt. Tillräckligt bra för spel, aldrig för lösenord eller kryptering. Se: Slump & Moduler . Pseudo kommer från grekiskan och betyder falsk eller låtsad, så ordet betyder ungefär låtsasslump. Namnet låter som en brist, men för allt du bygger i den här kursen räcker det gott: en tärning som beter sig som en tärning är tärning nog för ett spel.

Det finns ett ställe där det inte räcker, och det är säkerhet. Ska ett program lotta fram ett lösenord eller en krypteringsnyckel duger inte “ser slumpmässigt ut”. Den som känner till startvärdet kan nämligen räkna fram exakt samma kedja igen, och då är hemligheten ingen hemlighet.

Tärningsduellen

Två tärningar, en vinnare. Kör koden nedan ett par gånger och se hur utfallet skiftar:

Editor

Redo.

import math, samma mönster, annan modul

random är inte unikt. Alla Pythons inbyggda moduler fungerar på samma sätt. math ger dig matematiska funktioner som inte finns inbyggt i Python direkt:

Editor

Redo.

math.sqrt() räknar ut kvadratroten ur ett tal, och svaret blir 5.0 med en decimal även när roten går jämnt ut. Du behöver den inte i det här temat, men du känner nu igen mönstret när du ser det, och kvadratroten dyker upp igen längre fram.

Uppgift: Gissa talet

Skapa filen gissa.py. Du bygger om Tärningsduellen till ett spel, med samma delar men en mänsklig motståndare.

  1. Importera random längst upp i filen.

  2. Låt datorn tänka på ett tal mellan 1 och 10 med random.randint() och lagra det i en variabel.

  3. Fråga användaren efter en gissning med input(), och gör om svaret till ett heltal med int().

  4. Kontrollera om gissningen är lika med talet och låt if/else avgöra svaret, samma form som i duellen. Skriv ut både gissningen och det rätta talet, oavsett hur det gick.

  5. Kör programmet i terminalen flera gånger, tills du fått både en rätt och en felaktig gissning.

  6. Stagea, committa och pusha via Source Control-panelen.

Vad händer om

Kör random.randint(6, 1) i sandlådan, alltså med det större talet först. Vad svarar Python?

Motivera & reflektera

Ta bort int() runt din input() och kör igen. Programmet kraschar inte, men det säger att du gissat fel varje gång. Motivera varför, med utgångspunkt i vad input() alltid lämnar tillbaka.

Nästa nivå

Låt programmet avslöja mer än rätt eller fel: säg för högt eller för lågt när gissningen är fel, så att spelaren har något att gå på. Det kräver ett tredje utfall, och nyckelordet för det heter elif. Vi tar det ordentligt i Konsten att välja, men försök gärna på egen hand först.