2012-08-16 5 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()의 경우과 같은 정렬 옵션을 전달할 수 있습니다.등등 두 개의 매개 변수 (배열에서 비교할 두 요소)를 받아들이는 사용자 지정 비교 함수 참조 (콜백)도 있습니다. AS3 설명서에서 :

비교 함수는 비교할 두 개의 인수를 취해야합니다. 요소 A와 B가 주어지면 compareFunction의 결과는 음수, 0 또는 양수 값을 가질 수 있습니다.

  • 음수 반환 값은 A가 정렬 순서에서 B 앞에 표시되도록 지정합니다.
  • 반환 값 0은 A와 B가 동일한 정렬 순서를 갖도록 지정합니다.
  • 양수 리턴 값은 A가 정렬 된 순서에서 B 다음에 표시되도록 지정합니다.

참고 : 비교 함수 매개 변수 (배열이 입력되어있는 경우)를 입력하고 배열을 정렬 할 때

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

이 방법은 매우 유용하다 : 예를 들어, 원하는 이름을 가질 수 있습니다 요소들을 그들의 특별한 속성들로 랜덤 화의 경우, compareFunction는 무작위로 -1, 0 또는 1을 돌려 주어, 배열 요소로 장소 (인덱스)를 바꿉니다. 나는 더 나은 무작위 화 (주관적이고 수학적으로 검증되지 않은 의견에서) 방법이 -11 만 반환 할 때라는 것을 발견했다. 또한 사용자 정의 비교 함수 doesn't compare elements sequentially을 사용하여 정렬 기능을 염두에 두어야합니다. 따라서 일부 특수한 경우에는 임의 화 결과가 예상과 다를 수 있습니다.

+2

나는 (Math.random() <.5)라고 생각하십니까? -1 : 1'이 더 좋습니다. – Florent

+0

동의하고, 더 효율적이며, 둥글 필요가 없습니다. – BadFeelingAboutThis

+0

이것은 꽤 굉장합니다. 선을 무너 뜨리고 그들이하는 일을 설명 할 수 있습니까? 마찬가지로 (a : *, b : *)와 정렬 등이 무엇입니까? –

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, map 및 sort 함수에 대한 큰 팬이다.

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

이 내가

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

배열

에서 임의의 문자열을 선택 메모리 게임 (36 개) 카드를 내 배열을 무작위 방법입니다
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));