Hallo Micha,
Du darfst nicht jede Zufallszahl direkt ins Array speichern, sondern mußt schauen, ob es den Wert schon gibt. Eine Methode inArray() gibt es nicht, kann aber "nachgebaut" werden.
Das ist ist im Prinzip richtig, aber der Vorschlag zur Umsetzung ist etwas umständlich und hat Mängel.
Z.B. folgender rekursive Aufruf
if (typeof(this[i]) == "object"){
return this[i].inArray(val);
}
funktioniert nur, wenn ein Arrayelement wiederum ein Array ist. Wenn es aber ein anderes Objekt ist, ergibt `this[i].inArray(val)`{:.language-javascript} einen Fehler.
[Gunnar hat inzwischen auch darauf hingewiesen](https://forum.selfhtml.org/?t=163655&m=1065894), dass man statt `Math.round`{:.language-javascript} besser `Math.floor`{:.language-javascript} benutzen sollte, um zufälligere Ergebnisse zu erhalten.
Folgendende Methode .shuffle() arbeitet besser:
~~~javascript
Array.prototype.shuffle = function() {
if (!this.length) {return;}
var r, rA = new Array(this.length);
do {
do {
r = Math.floor(Math.random() * rA.length); // neue ganze Zufallszahl (0...Anzahl Elemente)
} while (typeof rA[r] !== 'undefined'); // solange die Zahl schon gezogen wurde
rA[r] = this.pop();
} while (this.length);
do{
this.push(rA.pop());
} while (rA.length);
};
Hier hat man einen der wenigen Fälle, wo es Sinn macht, die Arraylänge schon bei der Deklaration anzugeben.
Gruß, Don P