Neue Antwort schreiben 
 
Themabewertung:
  • 1 Bewertung(en) - 1 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Javascript: Zufallszahlen
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #11
RE: Javascript: Zufallszahlen
Fast alle Browser (mit Ausnahme von Apple-WebKit unter Windows, das einen kryptografisch sicheren Zufallsgenerator nutzt) nutzen einen linearen Kongruenzgenerator mit unterschiedlicher Periode auf Basis der ursprünglichen Java-Implementation bzw. rand() in der GNU- oder BSD-C-Standardbibliothek. Ein Problem ist dabei, dass der Startwert dabei neben anderen Faktoren (z. B. Fenster-Handle beim IE) häufig nur vom Startzeitpunkt des Browserprozesses abhängt.

Deswegen kann es sein, dass der Zufall häufig nicht zufällig genug aussieht. Ich habe auch in ein Projekt wie von Dirk beschrieben eine Warteschlange eingebaut, die die letzten 100 Ergebnisse nicht als zufälliges Ergebnis zulässt. Da handelte es sich aber auch schon um den gesamten Bestand von Flashloops auf z0r.de, die sich in ihrer Gesamtheit z. Zt. auf 7099 belaufen.

Ggf. wäre ein anderer, in Javascript implementierter PRNG wie z. B. ein Mersenne-Twister geeignet.

Ansonsten kann ich deinen Anwendungsfall auch nicht weiter nachvollziehen.

Code:
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (var i = 0; i < 20; i++) {
  console.log( // yay, funktionales Programmieren
    Array.apply(null, Array(60)).map(function(_, i) {
     return alphabet.charAt(Math.floor(Math.random() * alphabet.length))
    }).join("")
  )
}

BZJRBKXQGHGZJRKXRZGPNXRPAWAEPDLWFPJVJEERXGFGYGQXLLUNBXOGTXBQ
BDDCPPKLPGRGDSIFHABRMMNLGGTYXGKNLVMXDJHBMPPEABLQGZCXWYAMXIZY
UGOUUKNARTDXPWQOZOYCOBZXJCUYTUKAMIFIMACFVERUNGCXYVJWWMWEZAZC
VYHYQAKJZLPPAPVQDQBHTDHZNTLRKSTXONSHNAGBBIHKXGNOWVXPWFIMEWST
ITOIUOQOFQLMKZLOVWUAWFXIIGUCDODWLYYMGSKFLFIZFOHCZFXRRNGLUCZA
NEOBYNLMEQFLBGFIDFSHEPFNOZIPCUGXTHEFMMVGCRZYEIURLQNFKXQOFQDJ
VHDGPBAZUWJOFYLUOMZGOTSVJUBNGVAFHMQACPCNGYRMKILWDYUWTXJXKYJV
MFNCQJWGYMPADYPDHERJSWRAAZGHNADVXTTWINXLAUOVNNKIVVHNANYVJAFU
RJJJLXWLUACPGEKMCHFWNRFTCRQXDYNTRFROPNOTHEDXSJIKMOPUVIJVWCJL
YOJGSHMRNIJKGZVMWQFOULRGXBGNRORVHXANOEPMDJMXKLDQEUIGFEGBFPUG
SWNHBQTKDPBUWZRESNXZAJEPAQCDYXOHYEYRVZMITIFDGPNCFVPZQZIVZCVP
GPYYWTEXQQDIHRWSZQVOCEUZMYYDOKTQYITBJSTGTYVLCHCVFINJGUZDXEAO
WECGJIDXLGFZFRTGLWVGZHHYVITSUJLFMIILNRTEXWPLYPXUEPDBBZDUHQFQ
VJVVWABNLFWEOBRHPOJQKHGMZPPOJBOLRVVJRORWWGDOIEAQNSOFUIKLDDRY
TZWFQDUDOTUQCAKXZOOCZDCKTKLSORNMMMJAMLJVENPAGWTXRVLNLOLMEVZZ
KAAWEMUHMEQGKQMRJIWPIQUFOGKCGURQEOVBVSWVSSIUSSBDKPRWNJELUOAQ
OFWEXHPIPNIUSDLNCQFVVHCFOHADWDXXKQGQPDHTEJYAEMXKXCUJYIFZQDHQ
CYKYNFBHDPCVYWYOGBTTDHYOEFOJNIREEDKATMGUENJMYEPPQEEAWAJITMTE
EEODYLFEJSFIMHSALGGKFCJQABINPIGLAWUTXOQQGZLDKZMUOTCRZYYJKQCA
JRPPDUGDGZOTPISHQCRQCBYEAHHSVHTCBHOSQGYKABIDTHHSFIPXVGONWVPR

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
(Dieser Beitrag wurde zuletzt bearbeitet: 16.06.2015 17:39 von DosAmp.)
16.06.2015 17:37
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Der Doktor Offline
%0|%0

Beiträge: 7.872
Registriert seit: Dec 2008
Beitrag #12
RE: Javascript: Zufallszahlen
Ich empfehle: Dual_EC_DRBG

Es ist besser nicht zu moderieren als falsch zu moderieren
16.06.2015 17:37
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mrshadowtux
Unregistered

 
Beitrag #13
RE: Javascript: Zufallszahlen
So habe ich das momentan:
Code:
function zufallszahl(min,max)
{
    return(min+Math.round(Math.random()*(max-min)));
}

function getbuchstabe()
{
    var alphabet=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","R","S","T","U","V","W","Z"];
    var buchstabenzahl=alphabet.length;
    var zufall=zufallszahl(0,buchstabenzahl);
    return alphabet[zufall];
}

(Q, R, X und Y bewusst weggelassen)
16.06.2015 19:25
Diese Nachricht in einer Antwort zitieren
friedrichheinze Offline
...und Kondensatoren.

Beiträge: 2.840
Registriert seit: Jul 2008
Beitrag #14
RE: Javascript: Zufallszahlen
1. Wenn dir der lineare Kongruenzgenerator nicht zufällig genug aussieht, machst du was falsch (ausser du arbeitest an Krypto).
2. Zufall ist halt zufällig ¯\_(ツ)_/¯
16.06.2015 20:54
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Online
Quälgeist

Beiträge: 8.950
Registriert seit: Jul 2008
Beitrag #15
RE: Javascript: Zufallszahlen
Erster kurzer Hinweis, da ist ein Bug im Code. So wie deine Funktion geschrieben ist, sind sowohl min als auch max inklusive. Da hast du in manchen Fällen Rückgabewerte ausserhalb des Arrays (zufall == array.length).

Bugfix, einfach abrunden, siehe unten.

Math.round() ist sowieso gefährlich, siehe: https://de.wikipedia.org/wiki/Rundung#Ma...hes_Runden

»Das kaufmännische Runden erzeugt kleine systematische Fehler, da das Aufrunden um 0,5 vorkommt, das Abrunden um 0,5 jedoch nie; das kann Statistiken geringfügig verzerren.«

In deinem Falle ist hier aber noch ein anderes Problem: Weil A am Rand ist, können nur die Werte [0 bis 0.4999] zu A werden. Für alle anderen ist es aber mehr, nämlich z.B. [3.5 bis 4.4999] für den Buchstaben D. Das heisst konkret, dass A bei dir halb mal so oft vorkommt wie alle anderen Buchstaben! Für das letzte Element gilt das gleiche - das ist bei dir wegen obigem Bug aber nicht einem Buchstaben zuzuweisen.

Darum: Unbedingt Math.floor() (oder .ceil()) nehmen!

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

Die Zufälligkeit sieht für mich aber ziemlich okay aus, das ist alles Uniformverteilt wie es sein soll: https://jsfiddle.net/p7r3owL3/
Tipp: Mach Math.round() an, dann siehst du auch den statistischen Fehler den ich erwähnt habe.

Wenn du die Anzahl versuche runterdrehst (z.B. auf 100) dann sieht es anders aus. Kann gut sein dass beim manuellen Testen (mit weniger als 100 Versuchen) ein Buchstabe überdurchschnittlich häufig vorkommt, so funktioniert halt Zufall. Erst bei sehr vielen Versuchen gleicht sich das wieder aus.

Meine Konklusion ist also, dass alles okay ist. Wenn du trotzdem einen besseren Zufallsgenerator willst (wobei wie heinze sagt, das Ding ist zufällig, sieht man halt nicht), alle modernen Browser (IE11+) besitzen einen kryptografisch sicheren Zufallsgenerator: https://developer.mozilla.org/en-US/docs...ndomValues

Der obligatorische Comic zu dem Thema
[Bild: Adt2Q7z.gif]

Nachtrag: Habe die Diskussion zwischen sandi und CHRISNEW oben übersehen, sorry!
(Dieser Beitrag wurde zuletzt bearbeitet: 16.06.2015 21:25 von gandro.)
16.06.2015 21:05
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mrshadowtux
Unregistered

 
Beitrag #16
RE: Javascript: Zufallszahlen
Danke für den Hinweis! Habe es jetzt auf "return(min+Math.floor(Math.random()*(max-min)));" umgebaut :)
16.06.2015 21:37
Diese Nachricht in einer Antwort zitieren
gandro Online
Quälgeist

Beiträge: 8.950
Registriert seit: Jul 2008
Beitrag #17
RE: Javascript: Zufallszahlen
Aus aktuellem Anlass (Blogpost von Kumpel, Englisch): http://nickler.ninja/blog/2015/06/28/csg...-weak-rng/

Kurzum: Math.random() ist zwar uniform (d.h. jede Zahl hat die gleiche Wahrscheinlichkeit), aber vorhersagbar. Wenn man zwei rohe (d.h der direkte Output zwischen 0 und 1), aufeinander folgende Zufallszahlen kennt, kann man die restlichen voraus sagen.
(Dieser Beitrag wurde zuletzt bearbeitet: 09.07.2015 00:13 von gandro.)
09.07.2015 00:13
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
CHRiSNEW Offline
Internetblasensammler

Beiträge: 2.864
Registriert seit: Jul 2008
Beitrag #18
RE: Javascript: Zufallszahlen
Oh schön.. Vielen Dank für den Link!

09.07.2015 09:27
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