2.14 Mer om slumptal
I ett tidigare exempel introducerades Math
-objektet och generering av slumptal och hur det kan konverteras till ett heltal. Då fungerade det som en tärning, dvs samma tal kan komma flera gånger och även flera gånger direkt efter varandra. Nu ska vi se hur vi kan använda slumptalet som index till en array och samtidigt ta bort det valda värdet ur arrayen. Då fungerar det som att dra kort ur en kortlek.
- Slumpmässigt valt heltal, som används som värde för en tärning. (Repetition av tidigare exempel.)
- Slumpmässigt valt index till en array, för val av ord.
- Slumpmässigt val av spelkort i en array. Valt kort tas bort från arrayen.
19 min.
Sammanfattning
- Ska slumptalet användas som index till en array, multiplicerar man med arrayens längd, t.ex.
Math.floor(myArray.length * Math.random())
Detta ger ett heltal mellan 0 och det högsta indexet i arrayen. - I ett slumpmässigt val som fungerar på samma sätt som att dra ett kort ur en kortlek, ska det som väljs inte kunna dyka upp igen. Detta kan man få genom att ha de tillåtna värdena (kort, ord, eller vad det handlar om) i en array. Man väljer slumpmässigt ett index till arrayen och tar ut det indexerade värdet. Sedan tar man bort det ur arrayen. Om vi antar att
allValues = ["ett", "två", "tre", "fyra"]
, blir koden:
let r = Math.floor(allValues.length * Math.random());
let selectedValue = allValues[r];
allValues.splice(r, 1);
- Vill man kunna börja om igen med alla värden, dvs "ta fram en ny kortlek", kan man ta en kopia av arrayen och sedan använda kopian, då man väljer slumpmässiga värden. Kopian kan t.ex. erhållas med
copyValues = allValues.slice(0)
. Sedan använder mancopyValues
istället förallValues
, när man beräknar slumpmässigt index och tar bort det värde som valts.- Det går också använda "spread"-operatorn, för att kopiera en array. Då skriver man
copyValues = [...allValues];
- Det går också använda "spread"-operatorn, för att kopiera en array. Då skriver man
Egna övningar
Här följer ett förslag på några egna övningar. Öppna filen test.html och test.js och utför följande. All kod skriver du i funktionen test
.
- Inför variabeln
copyWords
och lägg in en kopia avallWords
i den. - Skriv en
for
-loop som genomlöps åtta gånger. Gör följande i loopen:- Generera ett slumpmässigt index till
copyWords
. - Indexera
copyWords
med ditt index och pusha ordet till arrayenselectedWords
. - Ta bort det valda ordet ur
copyWords
.
- Generera ett slumpmässigt index till
- Efter loopen lägger du in
selectedWords.sort()
för att sortera listan i bokstavsordning. - Slutligen ska du skriva ut orden i
li
-elementen. Skriv enfor
-loop som går igenom alla element iwordElems
. I loopen skriver duselectedWords[i]
i detli
-element som bestäms avwordElems[i]
.- Glöm inte
innerText
.
- Glöm inte