Slumpgenerator

Näin Math.random() toimii

Math.random() on yksi JavaScriptin käytetyimmistä metodeista satunnaisten arvojen luontiin. Se on helppo käyttää ja sopii kaikkeen pienistä interaktioista peleihin ja simulaatioihin.

Konfetin heittäminen voi tuntua satunnaiselta
Konfetin heittäminen voi tuntua satunnaiselta
Sisällysluettelo

Mitä Math.random() on ja miten se toimii?

Math.random() on JavaScriptin sisäänrakennettu metodi, joka palauttaa liukuluvun väliltä 0 (mukaan lukien) ja 1 (pois lukien). Arvo on siis aina vähintään 0, mutta ei koskaan tasan 1. Siksi se toimii hyvänä pohjana erilaiselle satunnaisuudelle.

Taustalla käytetään pseudosatunnaislukugeneraattoria (PRNG). Se tarkoittaa, että luvut eivät ole matemaattisesti täysin satunnaisia, vaan algoritmin laskemia. Useimmissa käytännön tapauksissa — kuten peleissä, arvonnoissa tai satunnaisissa väreissä — Math.random() riittää hyvin. Edistyneeseen kryptografiaan tai tietoturvakäyttöön se ei kuitenkaan ole tarpeeksi vahva.

Esimerkkejä Math.random()-metodin käytöstä

Yksinkertainen esimerkki on satunnaisluvun generointi väliltä 0–9. Se tehdään kertomalla Math.random() tulos luvulla 10 ja pyöristämällä alaspäin:

const number = Math.floor(Math.random() * 10)

Samalla periaatteella voit säätää väliä kertomalla eri luvulla ja lisäämällä siirtymän. Jos haluat esimerkiksi luvun väliltä 5–15, voit kirjoittaa:

const number = Math.floor(Math.random() * 11) + 5

Tällä tavalla voit arpoa kokonaislukuja ja desimaaleja, valita satunnaisen alkion taulukosta tai lisätä vaihtelua väreihin, sijainteihin ja liikkeisiin verkkosovelluksessa.

Yksinkertaista apufunktiolla

Koodista tulee selkeämpää ja uudelleenkäytettävämpää, kun teet apufunktion, joka ottaa taulukon ja palauttaa siitä satunnaisen arvon.

const random = (array) => array[Math.floor(Math.random() * array.length)]
const result = random(['Kyllä', 'Ei'])

result on ajon aikana joko Kyllä tai Ei, ja sen voi näyttää käyttäjälle halutulla tavalla.

Tyypillisiä käyttötapauksia Math.random()-metodille

Math.random() on yleinen valinta pienissä projekteissa, joissa tarvitaan vaihtelua. Tyypillisiä esimerkkejä ovat satunnaiset taustavärit tai satunnaisen sitaatin valinta listasta.

Pelinkehityksessä metodia käytetään esimerkiksi aloituspaikkoihin, esteisiin, loottiin ja satunnaisiin tapahtumiin. Simulaatioissa sillä voidaan mallintaa epävarmuutta tai luonnollista vaihtelua. Se on myös hyödyllinen testidatan luomisessa, kun haluat eri arvoja joka ajokerralla.

On kuitenkin tärkeää muistaa, että satunnaisuus ei ole "aitoa". Koska arvot perustuvat algoritmiin, ne voidaan ennustaa, jos generaattorin tila tunnetaan. Peleissä ja yksinkertaisissa sovelluksissa tämä ei yleensä haittaa, mutta tietoturvakriittisissä toiminnoissa kannattaa käyttää kryptografista satunnaisuutta.

Math.random()-metodin edut ja rajoitukset

Math.random()-metodin suurin etu on yksinkertaisuus — yksi funktiokutsu antaa uuden satunnaisarvon. Se on myös JavaScriptin standardia ja toimii kaikissa moderneissa selaimissa ilman lisäkirjastoja.

Rajoitus on se, ettei se sovellu tilanteisiin, joissa tarvitaan todella satunnaisia lukuja. Tietoturvakriittisiin tarkoituksiin, kuten salasanojen tai avainten luontiin, suositellaan Web Crypto API:a (esim. crypto.getRandomValues()).

Useimmissa käyttötapauksissa Math.random() on silti täysin riittävä. Se antaa kehittäjille nopean ja joustavan tavan lisätä vaihtelua ja ennakoimattomuutta ohjelmiin.

Miten Slumpgenerator siirtyi Math.random()-metodista crypto.getRandomValues()-metodiin

Slumpgenerator rakennettiin alun perin Math.random()-metodin varaan. Vaikka se toimii arjessa hyvin, se ei ole kryptografisesti turvallinen — arvot voidaan teoriassa ennustaa, jos PRNG:n sisäinen tila tunnetaan.

Sittemmin Slumpgeneratorin satunnaislukugenerointi on siirretty käyttämään Web Crypto API:n crypto.getRandomValues()-metodia, joka hyödyntää käyttöjärjestelmän entropialähteitä ja on huomattavasti vaikeammin ennustettava. Lue lisää siitä, miten crypto.getRandomValues() toimii.

Lue lisää metodista Mozillan sivuilta MDN.

Käännökset

Viimeksi päivitetty tekijä Vincent Lejtzén.