Don P: Zufallszahl ohne Dopplung erzeugen

Beitrag lesen

Hallo,

Mische das Array. Siehe z.B. Jürgens Vorschlag.

Hallo,

Du meinst folgenden?

Array.prototype.shuffle=function() {  
 var l=this.length,t,zi,i=l;  
  do {  
   zi=Math.floor(Math.random()*i);  
   t=this[zi];  
   this[zi]=this[--i];  
   this[i]=t;  
  } while (i);  
}  

Das Ding mischt doch nicht. i wird anfangs mit 1 initialisiert und im ersten Durchlauf mit --i zu 0, so dass wegen while(i) es keinen zweiten Durchlauf geben kann, oder sehe ich das falsch?

Gemeint ist wahrscheinlich etwas wie die Methode nach Fischer-Yates, aber die geht so:

myArray.shuffle = function(){  
  
  var v,j,i=this.length;  
  if(!i){return false;}  
  
  while(--i){  
  
    v=this[i];  
    j=Math.floor(Math.random()*(i+1));  
    this[i]=this[j];  
    this[j]=v;  
  }  
}  

Das ist verteilungsmäßig so gut wie der Zufallsgenerator halt ist.

Es wird Element aus dem Array zufällig gezogen und mit dem letzten Element vertauscht, dann das nächste Element aus den verbleibenden (length-1) gezogen und mit dem vorletzen vertauscht usw., bis das ganze Array durchgemischt ist.

Gruß, Don P