2012-08-16 83 views

回答

17

有使用中的Array.sort()函數的一個短版:

var arr : Array = [0,1,2,3,4,5,6,7,8,9]; 

function randomize (a : *, b : *) : int { 
    return (Math.random() > .5) ? 1 : -1; 
} 

trace(arr.sort(randomize)); 

如果你沒有得到 「足夠的」 隨機性您可以按兩次:)

編輯 - 逐行解釋:

對於Array類方法sort()您不僅可以傳遞排序選項,如Array.CASEINSENSITIVE, Array.DESCENDING等等,而且還有您自己的自定義比較函數引用(回調函數),它接受兩個參數(要比較的數組中的兩個元素)。從AS3文檔:

比較函數應該有兩個參數進行比較。給定元素A和B,compareFunction的結果可以具有負值,0或正值:

  • 負的返回值指定A在排序的序列中出現在B之前。
  • 返回值0指定A和B具有相同的排序順序。
  • 正返回值指定A在排序後的序列中出現在B之後。

注:比較函數的參數可能會被輸入(如果你的數組類型的),並有你想要如:

function compareElements (elementA : SomeClass, elementB : SomeClass) : int; 

這種方法是非常有用的任何名字的時候,你需要排序數組元素的特殊屬性。在隨機情況下,compareFunction隨機返回-1, 01,並使數組元素切換其位置(索引)。我發現更好的隨機化(在我的主觀和未經測試的觀點中)是方法只返回-11。還要記住,自定義比較功能doesn't compare elements sequentially排序功能,所以在某些特殊情況下,隨機結果可能會與您所期望的不同。

+2

我覺得'(Math.random()<.5)? -1:1'更好。 – Florent 2012-08-16 11:54:34

+0

同意,更高效,不需要輪詢 – BadFeelingAboutThis 2012-08-16 16:31:28

+0

這真是太棒了。你能分解線路並解釋他們在做什麼嗎?像什麼是(a:*,b:*)和排序等。 – 2012-08-16 16:59:45

1

我發現這非常有幫助。我希望它也能幫助你。

// Array to Randomize 
var firstArray:Array = ["One","Two","Three","Four","Five","six","seven","eight","nine","ten"]; 
trace(firstArray); // Prints in order 

var newArray:Array = new Array(); 
function randomizeArray(array:Array):Array 
{ 
    var newArray:Array = new Array(); 

    while (array.length > 0) 
    { 
     newArray.push(array.splice(Math.floor(Math.random()*array.length), 1)); 
    } 

    return newArray; 
} 

var randomArray:Array = randomizeArray(firstArray); 
trace(randomArray); // Prints out randomized :) 
2

有一個更好的辦法,也將讓你隨機數組中的地方,如果你需要,它不會讓你創造更多然後你原來的數組的一個副本。

package 
{ 
    import flash.display.Sprite; 

    public class RandomizeArrayExample extends Sprite 
    { 
     public function RandomizeArrayExample() 
     { 
      super(); 
      testDistribution(); 
     } 

     private function testDistribution():void 
     { 
      var hash:Object = { }; 
      var tester:Array = [1, 2, 3, 4]; 
      var key:String; 

      for (var i:int; i < 1e5; i++) 
      { 
       randomize(tester); 
       key = tester.join(""); 
       if (key in hash) hash[key]++; 
       else hash[key] = 1; 
      } 
      for (var p:String in hash) trace(p, "=>", hash[p]); 
     } 

     private function randomize(array:Array):Array 
     { 
      var temp:Object; 
      var tempOffset:int; 
      for (var i:int = array.length - 1; i >= 0; i--) 
      { 
       tempOffset = Math.random() * i; 
       temp = array[i]; 
       array[i] = array[tempOffset]; 
       array[tempOffset] = temp; 
      } 
      return array; 
     } 
    } 
} 
1

我有一個替代的要求,我想隨機將很多源數組插入目標數組。像Rytis一樣,我是forEach,陣列上的地圖和排序功能的忠實粉絲。

var randomInsert:Function = function callback(item:*, index:int, array:Vector.<MyItem>):void 
{ 
    var j:Number = Math.floor(Math.random() * targetArray.length); 
    targetArray.splice(j,0,item);     
} 

targetArray = new Vector.<MyItem>(); 
sourceArray1.forEach(randomInsert, this); 
sourceArray2.forEach(randomInsert, this); 
1

這裏是一個更簡單的功能。作品也在多維陣列

function randomizeArray(array:Array):Array 
{ 
    var newArray:Array = new Array(); 
    while (array.length > 0) 
    { 
     var mn=Math.floor(Math.random()*array.length) 
     newArray[newArray.length]=array[mn] 
     array.splice(mn,1) 
    } 
    return newArray; 
} 
0

如果你需要你的數組被洗牌(你的元素不能重複)。您可以使用此功能:

/** 
* Shuffles array into new array with no repeating elements. Simple swap algorithm is used. 
*/ 
public function shuffleArray(original:Array):Array 
{ 
    // How many swaps we will do 
    // Increase this number for better results (more shuffled array, but slower performance) 
    const runs:int = original.length * 3; 
    var shuffled:Array = new Array(original.length); 

    var i:int; 
    var a:int; 
    var b:int; 
    var temp:Object; 

    // Copy original array to shuffled 
    for(i=0; i<shuffled.length; i++){ 
     shuffled[i] = original[i]; 
    } 

    // Run random swap cycle 'runs' times 
    for(i=0; i<runs; i++){ 
     // There is a chance that array element will swap with itself, 
     // and there is always small probability it will make your shuffle 
     // results not that good, hence try to experiment with 
     // different runs count as stated above 
     a = Math.floor(Math.random() * original.length); 
     b = Math.floor(Math.random() * original.length); 

     // Swap messages 
     temp = shuffled[a]; 
     shuffled[a] = shuffled[b]; 
     shuffled[b] = temp; 
    } 

    return shuffled; 
} 

用法:

var testArray:Array = ["Water", "Fire", "Air", "Earth"]; 
trace(shuffleArray(testArray).concat()); 
0

我這是怎麼隨機我的36張卡片陣列的記憶遊戲

const QUANT_CARTAS: int = 36; 

//get the 36 numbers into the array 
for (var i: int = 0; i < QUANT_CARTAS; i++) 
{ 
    cartas.push(i); 
} 

//shuffles them =) 
for (var moeda: int = QUANT_CARTAS - 1; moeda > 0; moeda--) 
{ 
    var pos: int = Math.floor(Math.random() * moeda); 
    var carta: int = cartas[moeda]; 
    cartas[moeda] = cartas[pos]; 
    cartas[pos] = carta; 
} 
// and add them using the random order... 

    for (i = 0; i < QUANT_CARTAS; i++) 
{ 
    var novaCarta: Carta = new Carta(); 
    novaCarta.tipoCarta = cartas[i]; 
    etcetcetc............. 
} 
0

選擇從陣列

隨機字符串
function keyGenerator(len:Number):String 
{ 
    function randomRange(minNum:Number, maxNum:Number):Number 
    { 
     return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum); 
    } 
    var hexArray = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']; 
    var key = ""; 
    for (var i=0; i<len; i++) 
    { 
     key += hexArray[randomRange(0,hexArray.length-1)]; 
    } 
    return key; 
} 

用法:

trace(keyGenerator(16));