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
Nachtrag: Habe die Diskussion zwischen sandi und CHRISNEW oben übersehen, sorry!