Gernot Back: Zahlen von eins bis 16 in zufälliger Reihenfolge - Array mischen

Beitrag lesen

Hallo Struppi,

Das sieht eher so aus, als ob du ein Array mischen willst, da gibt es bessere Möglichkeiten.

Meinst du in etwa so?

  
var myArray = new Array ('null', 'eins', 'zwei', 'drei', 'vier',  
                        'fünf', 'sechs', 'sieben', 'acht', 'neun',  
                        'zehn', 'elf', 'zwölf', 'dreizehn',  
                        'vierzehn', 'fünfzehn', 'sechzehn');  
  
var mix = new Array();  
var max = myArray.length;  
  
function rollDice () {  
  var num = -1;  
  do {  
    num = parseInt(Math.random()* myArray.length);  
  } while((isNaN(num))||(num<0));  
  return num;  
}  
  
function mixIt (){  
  for (var i=0; i<max; i++) {  
    num = rollDice();  
    myArray1 = myArray.slice(0,num);  
    myArray2 = myArray.slice(num);  
    mix[i] = myArray2.shift();  
    myArray = myArray2.concat(myArray1);  
  }  
  myArray = mix;  
  return mix;  
}  
  
function writeIt () {  
   for (var i=0; i<30; i++) {  
     document.write(mixIt().join('<span style="color:red">&nbsp;|&nbsp;</span>')+'<br>');  
   }  
}  
  
writeIt();  

Da wird einfach ein Array-Member an zufälliger Stelle für das Mix-Array ausgewählt und gleichzeitig aus dem Ursprungsarray entfernt. Im nächsten Durchgang wird dann nur aus den verbliebenen Membern des Ursprungs-Arrays ausgewählt und auch dieses entfernt und usw. usf., bis das Ursprungsarray schließlich leer ist. Zum Schluss wird das Ursprungsarry mit seiner gemischten Kopie wieder befüllt, so dass es für die nächste Mischung wieder bereit steht.

Durch den Verzicht auf verschachtelte Schleifen und Zurücksetzen von Zählern sollte mit dieser Technik jedenfalls auch die CPU geschont werden, was sich bei sehr großen Arrays von mehreren hundert Membern wohl auch in der Berechnungszeit bemerkbar machen dürfte.

Gruß Gernot