Neue Antwort schreiben 
 
Themabewertung:
  • 1 Bewertung(en) - 1 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Javascript: Zufallszahlen
mrshadowtux
Unregistered

 
Beitrag #1
Javascript: Zufallszahlen
Moin,

momentan benutze ich für Zufallszahlen in Javascript folgende Funktion:
Code:
function zufallszahl(min,max)
{
    return(min+parseInt(Math.random()*(max-min+1)));
}

Oft kommen da jedoch gleiche Werte raus bzw die Wahrscheinlichkeit, dass bestimmte Werte kommen ist recht hoch. So wirklich zufällig ist das also nicht. Kann man das irgendwie verbessern?
16.06.2015 13:46
Diese Nachricht in einer Antwort zitieren
thosch97 Offline
All things have a right to grow

Beiträge: 9.843
Registriert seit: Feb 2010
Beitrag #2
RE: Javascript: Zufallszahlen
[Bild: random_number.png]

PGP-Key E384 009D 3B54 DCD3 21BF 9532 95EE 94A4 3258 3DB1 | S/MIME-Key 0x1A33706DAD44DA
G d-@ s+:- a--- C+++ UB+L++ P--- L++@ E-@>++ W+ N o? K? w>++ !O !M !V PS+++ PE-- Y+>++ PGP++>+++ !t 5? X? !R tv b+++>++++ DI !D G>+ e>+++ h !r>++ !z
„Die Aachener gelten als Erfinder des 4. Hauptsatzes der Thermodynamik: ‚Thermo schreibt man zweimal.“‘
“Saying that Java is good because it works on all platforms is like saying oral sex is good because it works on all sexes.”
„Es gibt 10 Sorten von Leuten: Die einen verstehen das Binärsystem, die anderen nicht.“
„Manche Männer lieben Männer, Manche Frauen eben Frauen; Da gibt's nix zu bedauern und nichts zu staunen; Das ist genau so normal wie Kaugummi kauen; Doch die meisten werden sich das niemals trauen“
16.06.2015 13:52
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mrshadowtux
Unregistered

 
Beitrag #3
RE: Javascript: Zufallszahlen
Auch ernstgemeinte Antworten?
16.06.2015 14:25
Diese Nachricht in einer Antwort zitieren
CHRiSNEW Offline
Internetblasensammler

Beiträge: 2.864
Registriert seit: Jul 2008
Beitrag #4
RE: Javascript: Zufallszahlen
Uhm, bei mir kommen recht unterschiedliche Zahlen raus?

Code:
> function test(n, min, max) {
...   var a=[];
...   for (var i = 0; i < n; i++) {
.....     a.push(zufallszahl(min, max));
.....   }
...   return a;
... }
undefined
> test(100, 1000, 2000);
[ 1556,
  1259,
  1769,
  1052,
  1811,
  1106,
  1771,
...
  1533,
  1891 ]

Code:
> function test2(n, min, max) {
...   var counter = 0, avg = 0;
...   test(n, min, max).map(function(i) {
.....     avg += i;
.....     counter++;
.....   });
...   avg /= counter;
...   return avg;
... }
undefined

> test2(1000, 10000, 20000);
15097.014
> test2(1000, 10000, 20000);
15115.344
> test2(1000, 10000, 20000);
14879.681
> test2(1000, 10000, 20000);
15006.768
> test2(1000, 10000, 20000);
14975.547
> test2(1000, 10000, 20000);
14992.434
> test2(1000, 10000, 20000);
15017.513
Das sieht doch auf dem ersten Blick solide verteilt aus?

Edit: parseInt ist eigentlich eine dumme Methode, um Zahlen zu runden. Es gibt extra Math.round dafür, denn parseInt macht aus 1.5 auch 1 und schon ist dein Zufall auf einer kleinen Zahlenmenge direkt über diesen Generator verfälscht.

(Dieser Beitrag wurde zuletzt bearbeitet: 16.06.2015 14:58 von CHRiSNEW.)
16.06.2015 14:52
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Dirk Offline
Software Archäologe

Beiträge: 14.737
Registriert seit: Jul 2008
Beitrag #5
RE: Javascript: Zufallszahlen
(16.06.2015 13:52)thosch97 schrieb:  [Bild: random_number.png]

Den wollte ich eigentlich auch bringen. Zum Thema: Wenn ein Pseudozufallsgenerator öfters die selben Zahlen bringt, muss es nicht heißen, das er nicht funktioniert. Zufällig kann es auch sein, dass der auch häufig die selbe Zahl bringt. Es gabs auch mal bei Apple Ipod shuffle, die leuten beschwerten sich, das der zufall manche songs bevorzugen würde. Die Apple Techniker konnten aber nichts am Allgorythmus finden und haben einfach ne Glättung rübergezogen, das die Zufall veränderte, in dem die Vergangenheit einbezogen wird.

Du kannst dir also Variablen für die letzten x Zahlen machen und in der aktuellen Ziehung überprüfen, ob in den letzten x Mal schonmal die Zufallszahl gezogen wurde. Wenn ja zieht er neu und falls neu, werden die variblen umgeschrieben.

Alternativ: Arbeite mit sehr großen Zahlbereichen mit Random, und Rechne den Modulo Rest von deinem Bereich. Ne Glättung tritt dabei nicht auf, aber vielleicht die Chance auf mehr Varianz im Pseudozufallszahlalgorytmus.

16.06.2015 15:01
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
CHRiSNEW Offline
Internetblasensammler

Beiträge: 2.864
Registriert seit: Jul 2008
Beitrag #6
RE: Javascript: Zufallszahlen
Ich hab eben nochmal herumgespielt und dieses +1 und parseInt verzerrt doch das Ergebnis, daher lieber:

Code:
function zufallszahl(min,max) {
    return(min+Math.round(Math.random()*(max-min)));
}

Ansonsten schließe ich mich Dirk an, wenn es um Pseudozufall-Anwendungsbereiche dieser Art geht.

16.06.2015 15:03
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
s4ndwichMakeR Offline
Realitätsfeinmotoriker‮

Beiträge: 5.195
Registriert seit: Jul 2008
Beitrag #7
RE: Javascript: Zufallszahlen
xkcd quoten ist nie falsch. :D

Bist du dir sicher, dass die Entropie zu gering ist? Ich hab’s mal mit 1 bis 100 getestet und ich finde es »ausreichend zufällig«. Geringe Zufallsbereiche sind für Menschen tückisch, weil sie oft den Eindruck vermitteln, sie wären nicht zufällig genug, aber auch mehrere aufeinanderfolgende Ergebnisse (im nicht ausufernden Maße) sind ein Zeichen für Entropie.

@CHRiSNEW: Erreicht man durch Runden nicht den ungewünschten Nebeneffekt wie bei Schulnoten, dass man für das erste und letzte Element nur den halben Spielraum hat?

• • • – • – – • – –
(Dieser Beitrag wurde zuletzt bearbeitet: 16.06.2015 15:08 von s4ndwichMakeR.)
16.06.2015 15:07
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
CHRiSNEW Offline
Internetblasensammler

Beiträge: 2.864
Registriert seit: Jul 2008
Beitrag #8
RE: Javascript: Zufallszahlen
(16.06.2015 15:07)s4ndwichMakeR schrieb:  @CHRiSNEW: Erreicht man durch Runden nicht den ungewünschten Nebeneffekt wie bei Schulnoten, dass man für das erste und letzte Element nur den halben Spielraum hat?

Hah, lustig. Ich wollte mich gerade im Augenblick noch verbessern. :) Da hast du natürlich Recht!

Daher doch (bzw die erste Version mit parseInt)
Code:
function zufallszahl(min,max) {
    return(min+Math.floor(Math.random()*(max-min+1)));
}

Also die Verteilung sieht jetzt weiterhin recht fair aus:

Code:
count(100000, 10, 30);
{ '10': 4714,
  '11': 4795,
  '12': 4807,
  '13': 4858,
  '14': 4819,
  '15': 4746,
  '16': 4711,
  '17': 4814,
  '18': 4794,
  '19': 4699,
  '20': 4771,
  '21': 4761,
  '22': 4898,
  '23': 4646,
  '24': 4676,
  '25': 4654,
  '26': 4740,
  '27': 4924,
  '28': 4757,
  '29': 4692,
  '30': 4724 }
Oder liege ich falsch? :)

16.06.2015 15:13
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mrshadowtux
Unregistered

 
Beitrag #9
RE: Javascript: Zufallszahlen
Ich habs über nen Array gejagt, welches das Alphabet enthielt. Kam leider relativ häufig E raus. Nicht immer, aber doch erschreckend häufig.

Ich werde mal testen, wie sich das mit der Variante "return(min+Math.round(Math.random()*(max-min)));" verhält, Vielen Dank schon mal!
16.06.2015 16:32
Diese Nachricht in einer Antwort zitieren
s4ndwichMakeR Offline
Realitätsfeinmotoriker‮

Beiträge: 5.195
Registriert seit: Jul 2008
Beitrag #10
RE: Javascript: Zufallszahlen
(16.06.2015 16:32)mrshadowtux schrieb:  Ich habs über nen Array gejagt, welches das Alphabet enthielt. Kam leider relativ häufig E raus. Nicht immer, aber doch erschreckend häufig.

Da hatte bestimmt Etaoin Shrdlu die Finger mit im Spiel.

• • • – • – – • – –
16.06.2015 16:59
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste