Hello out there!
Das schien mir erst nicht zu funktionieren. Dein Algorithmus
for(var i =0; i < this.length; i++){
rand = i + Math.floor(Math.random() * (this.length - i));
}
>
> bevorzugt zweifellos große Werte für rand.
Zweifellos. Muss ja auch:
Beim 1. Schleifendurchlauf ist rand aus dem Intervall [0, this.length[;
beim 2. Schleifendurchlauf ist rand aus dem Intervall [1, this.length[;
beim 3. Schleifendurchlauf ist rand aus dem Intervall [2, this.length[ ...
Beim 2. Schleifendurchlauf steht das Element rand[0] des am Ende auszugebenden Arrays schon fest und soll dann nicht mehr geändert werden;
beim 2. Schleifendurchlauf steht das Element rand[1] des am Ende auszugebenden Arrays schon fest und soll dann nicht mehr geändert werden ...
> rand: 0 1 2 3 4 5 6 7 8 9
> Anzahl: 952 2103 3456 4745 6532 8447 10874 14272 19249 29370
Zu erwartet gewesen wären\* (gerundet):
1000 2111 3361 4790 6456 8456 10956 14290 19290 29290
> Wie man sieht, steigt die Wahrscheinlichkeit für einen bestimmten rand-Wert mit dessen Größe stark an. Von Gleichverteilung kann da absolut nicht die Rede sein.
Nicht rand soll gleichverteilt sein, sondern die Permutationen der Arrayelemente.
> > Das ist von einer echten Zufallsverteilung weit entfernt, sollte man meinen.
Nö, passt schon.
Testen kannst du solch einen Algorithmus, in dem du jedes Vorkommen von
`Math.floor(Math.random() * n)`{:.language-javascript}
durch eine Schleife
`for (var i = 0; i < n; i++)`{:.language-javascript}
ersetzt; dann hast du nämlich die Zahlen von 0 bis n - 1 wirklich gleichverteilt erzeugt.
See ya up the road,
Gunnar
\* Berechnung:
1/10 \* 10000 = 1000
(1/10 + 1/9) \* 10000 = 2111.11111
(1/10 + 1/9 + 1/8) \* 10000 = 3361.11111
(1/10 + 1/9 + 1/8 + 1/7) \* 10000 = 4789.68254
--
„Und [dieses Forum] soll […] auch ein Fachforum bleiben und kein Psychologieforum werden.“ ([Kirsten Evers](https://forum.selfhtml.org/?t=158750&m=1033264))