Tips på bättre "random" funktion i javasript?

Permalänk
Medlem

Tips på bättre "random" funktion i javasript?

Hej

Har gjort ett glosförhör-program, där jag slumpar ut ett ord ifrån en array med object.
Slumpgeneratorn jag använder är js egna Math.random, men har märkt att vissa ord kan ha förekommit 7gånger medans andra ord inte förekommit en enda gång.

Så jag la till ett "antal" i objectet, där programmet räknade upp varje gång ordet förekom.
Sedan när jag slumpat fram ett nytt ord så kollade jag om detta ord förekommit oftare än medel, och har det gjort det så slumpar den fram ett annat ord istället.

Men vad är best practice när man vill göra något sådant här?

Antar att Math.Random får jämnare utfall om man använder den mer än säg 100ggr :), så det kanske inte är den bästa metoden för att slumpa fram ord tänkte jag.

Annars kan man även välja att den går igenom ordlistan uppifrån och ner givetvis. Men vill ha random ord också.

Visa signatur

I5 9600k@stock / Cooler Master Evo 212 / Gigabyte Z390 Gaming X / Corsair Vengeance LPX 16GB DDR4 3000MHz / MSI RTX2070 Gaming Z / EVGA 550 BQ / Asus VG27BQ 27" 165Hz

Ryzen 5 5600x@stock / Asus Rog Strix X570-E Gaming / Corsair Vengeance RGB Pro 16GB 3600MHz CL18 / MSI RTX3070 Suprim X / BeQuiet Pure Power 11 600W / Asus VG278Q 27" 144Hz

Permalänk
Medlem
Skrivet av CubaCola:

Hej

Har gjort ett glosförhör-program, där jag slumpar ut ett ord ifrån en array med object.
Slumpgeneratorn jag använder är js egna Math.random, men har märkt att vissa ord kan ha förekommit 7gånger medans andra ord inte förekommit en enda gång.

Så jag la till ett "antal" i objectet, där programmet räknade upp varje gång ordet förekom.
Sedan när jag slumpat fram ett nytt ord så kollade jag om detta ord förekommit oftare än medel, och har det gjort det så slumpar den fram ett annat ord istället.

Men vad är best practice när man vill göra något sådant här?

Antar att Math.Random får jämnare utfall om man använder den mer än säg 100ggr :), så det kanske inte är den bästa metoden för att slumpa fram ord tänkte jag.

Annars kan man även välja att den går igenom ordlistan uppifrån och ner givetvis. Men vill ha random ord också.

Jag tänker mig att det du i själva verket vill göra kanske inte är att slumpa ord utan att sortera listan slumpmässigt?

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Gör en lista med alla ord, skapa ett slumptal index från 0 till antal i listan - 1, sätt en variabel till värdet på platsen index i listan, plocka bort elementet på plats index ur listan, upprepa tills listan är tom.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Ett alternativ är att slumpa ordlistan istället (eller en separat array med index om du inte vill ändra på själva ordlistan), och sen gå igenom den från början till slut. Då får du en slumpmässig ordning på orden, men varje ord kommer bara förekomma en gång. Jag vet inte om Javascript har någon enkel funktion för att slumpa en array, annars är Fisher-Yates enkel att implementera själv.

Annars är det samma problem som uppstår med spellistor för t.ex. musik, så att googla på t.ex. "playlist shuffle algorithm" kanske kan ge lite idéer.

Permalänk
Medlem

Ah, perfekt. Hade inte en tanke på att slumpa ordlistan, smart!
Känner mig lite dum här som inte tänkte på det innan
Tackar!

Visa signatur

I5 9600k@stock / Cooler Master Evo 212 / Gigabyte Z390 Gaming X / Corsair Vengeance LPX 16GB DDR4 3000MHz / MSI RTX2070 Gaming Z / EVGA 550 BQ / Asus VG27BQ 27" 165Hz

Ryzen 5 5600x@stock / Asus Rog Strix X570-E Gaming / Corsair Vengeance RGB Pro 16GB 3600MHz CL18 / MSI RTX3070 Suprim X / BeQuiet Pure Power 11 600W / Asus VG278Q 27" 144Hz

Permalänk
Medlem

Jag gjorde ett fulhack.

Slumpade fram nummer in i en array och konverterade sedan till en set för att få bort duplicates där jag sedan använde min set som ett index för ordlistan

Inte det finaste jag gjort men fungerar bra.
Tack för ideen att slumpa listan iaf.

Visa signatur

I5 9600k@stock / Cooler Master Evo 212 / Gigabyte Z390 Gaming X / Corsair Vengeance LPX 16GB DDR4 3000MHz / MSI RTX2070 Gaming Z / EVGA 550 BQ / Asus VG27BQ 27" 165Hz

Ryzen 5 5600x@stock / Asus Rog Strix X570-E Gaming / Corsair Vengeance RGB Pro 16GB 3600MHz CL18 / MSI RTX3070 Suprim X / BeQuiet Pure Power 11 600W / Asus VG278Q 27" 144Hz

Permalänk
Medlem

Obligatoriska skojlänkar när man pratar om random:

Permalänk
Avstängd
Skrivet av lydell:

Obligatoriska skojlänkar när man pratar om random:

Tänker alltid på den första när folk pratar slumpgeneratorer.

Minns en mjukvara som skulle slumpa ordningen som musiken spelades upp i GTA 3 (kan ha varit Vice City) som bara la in en slumpad siffra i början på varje filnamn, så den slumpades en gång sen var det ordningen. Körde man programmet igen så las det till ytterligare en siffra. Riktigt smart mjukvara.