wie kann man in JavaScript eine Funktion erstellen, die eine zufällige Zahl generiert?
Hi Leute!
Wie kann ich ich JavaScript eine Funktion erstellen, die jede Zahl zufällig von 1 bis 16 auswählt, jedoch darf keine mehrmals vorkommen.
Vielen dank im voraus🙂
4 Antworten
Das Shuffle von EinAlexander ist schon mal ein Blick in die richtige Richtung.
Wie Du bereits bemerkt hast ist eine Fifty-Fifty Umsortieren nicht zufällig genug.
Wenn es um das Mischen einer endlichen Anzahl von Elementen geht , dürfte die Fisher-Yates-Permutation für ausreichende Zufälligkeit garantieren.
Hier noch Beispiele für die Umsetzung in Javascript:
- https://sebhastian.com/fisher-yates-shuffle-javascript/
- https://www.tutorialspoint.com/what-is-fisher-yates-shuffle-in-javascript
- https://www.geeksforgeeks.org/shuffle-a-given-array-using-fisher-yates-shuffle-algorithm/
Ich hatte nach der Gassirunde etwas Zeit um 2 kleine Demos zu schreiben:
shuffle FY.html
<!DOCTYPE html>
<html>
<body>
<h2>Mische zufällig</h2>
<p id="demo"></p>
<script>
maxNumbers=49
myShuffle=Array.from({length: maxNumbers}, (_, i) => i + 1)
LastIndex = myShuffle.length;
//mischen nach Fisher-Yates
while (--LastIndex > 0) {
randIndex = Math.floor(Math.random() * (LastIndex + 1));
[myShuffle[randIndex], myShuffle[LastIndex]] = [myShuffle[LastIndex], myShuffle[randIndex]];
}
//zu einem String zusammenfügen
document.getElementById("demo").innerHTML = myShuffle.join(' ');
</script>
</body>
</html>
6aus49.html
<!DOCTYPE html>
<html>
<body>
<h2>Lottozahlen</h2>
<p id="LottoZahlen"></p>
<p id="Rest"></p>
<script>
maxNumbers=49
AlleZahlen=Array.from({length: maxNumbers}, (_, i) => i + 1)
LastIndex = AlleZahlen.length
AnzahlLotto=6
MyLotto=[]
for (i=0;i<AnzahlLotto;++i ){
randIndex = Math.floor(Math.random() * (LastIndex + 1));
[AlleZahlen[randIndex], AlleZahlen[LastIndex]] = [AlleZahlen[LastIndex], AlleZahlen[randIndex]]; //gezogene zahl mit der am Ende tauschen
MyLotto.push(AlleZahlen.pop()) //AlleZahlen.pop() entfernt das letzte (getauschte)Element und fügt es den gezogenen Zahlen (MyLotto.push) hinzu.
}
//zu einem String zusammenfügen
document.getElementById("LottoZahlen").innerHTML = MyLotto.sort((a, b) => a - b).join(' ');
document.getElementById("Rest").innerHTML = 'Rest :'+ AlleZahlen.join(' ');
</script>
</body>
</html>
sorry ich hatte einen kleinen Denkfehler im letzten Script.
<html>
<body>
<h2>Lottozahlen</h2>
<p id="LottoZahlen"></p>
<p id="Rest"></p>
<script>
maxNumbers=49
AlleZahlen=Array.from({length: maxNumbers}, (_, i) => i + 1)
LastIndex = AlleZahlen.length-1
AnzahlLotto=6
MyLotto=[]
for (i=0;i<AnzahlLotto;++i ){
randIndex = Math.floor(Math.random() * (LastIndex+1 ));
[AlleZahlen[randIndex], AlleZahlen[LastIndex]] = [AlleZahlen[LastIndex], AlleZahlen[randIndex]];
currentNum=AlleZahlen.pop()
MyLotto.push(currentNum)
LastIndex = AlleZahlen.length-1
}
//zu einem String zusammenfügen
document.getElementById("LottoZahlen").innerHTML = MyLotto.join(' ');//.sort((a, b) => a - b)
document.getElementById("Rest").innerHTML = 'Rest :'+ AlleZahlen.join(' ');
</script>
</body>
</html>
...da ich LastIndex nicht aktualisiert hatte ginge einige Tauschoperationen ins Leere.
Nun klappts.
Das ganze hat zusätzlich den Vorteil, das mit jeder gezogenen Zahl auch der Rest der zahlen weiter durchmischt wird. (die Ursprünglch letzte Zahl erscheint an der zufälligen Position der letzten gezogenen Zahl)
Wie kann ich ich JavaScript eine Funktion erstellen, die jede Zahl zufällig von 1 bis 16 auswählt, jedoch darf keine mehrmals
hier das Prinzip
let numbers = [1, 2, 3, 4, 5, 6, 7, 8];
let shuffledNumbers = numbers.sort(function () {
return Math.random() - 0.5;
});
console.log(shuffledNumbers);
Alex
https://blog.codinghorror.com/the-danger-of-naivete/ Problem wird hier erklärt.
Speichere die Zahlen 1 bis 16 als Paar mit Zufallszahlen von 0 bis 1 und sortier anschließend die Liste.
Ich sehe dir wurde schon geholfen. Wenn du weiter Javascript trainieren möchtest, kann ich dir dieses kostenlose Spiel empfehlen:
https://itgy.de/schulungen/scriptfighter-javascript-lernspiel/
Das ist möglich, ist leider nicht besonders zufällig.
Für ein Videospiel reicht es aus, für ein Gewinnspiel eher nicht...