如何隨機化使用actionscript 3的數組?as3隨機數組 - 隨機數組 - actionscript 3
7
A
回答
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, 0
或1
,並使數組元素切換其位置(索引)。我發現更好的隨機化(在我的主觀和未經測試的觀點中)是方法只返回-1
和1
。還要記住,自定義比較功能doesn't compare elements sequentially排序功能,所以在某些特殊情況下,隨機結果可能會與您所期望的不同。
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));
相關問題
- 1. ActionScript 3(AS3)如何挑選隨機數組?
- 2. 隨機數組?
- 3. 隨機數組的3個ID數組
- 4. AS3隨機數
- 5. PHP數組隨機
- 6. 隨機遍歷數組(不隨機)
- 7. 隨機排列隨機數組
- 8. Java隨機數組
- 9. Javascript隨機數組
- 10. Symfony:隨機數組
- 11. 隨機從數組
- 12. 隨機數不是數組
- 13. 隨機整數數組
- 14. 使用ActionScript-3生成隨機數
- 15. 數組,函數和隨機
- 16. Actionscript 3:試圖創建一個隨機數組
- 17. 數組和隨機數
- 18. 數組中的隨機數
- 19. 按組分配隨機數
- 20. MATLAB隨機數組編碼隨着INT
- 21. Javascript數組隨機填充
- 22. 在隨機數組中使用數字隨機數
- 23. 隨機數組特殊
- 24. 數組的隨機值
- 25. 隨機排列的數組
- 26. PHP的隨機與數組
- 27. 隨機數組句子?
- 28. AS2數組隨機選擇
- 29. 隨機化/修改數組
- 30. 生成隨機數組
我覺得'(Math.random()<.5)? -1:1'更好。 – Florent 2012-08-16 11:54:34
同意,更高效,不需要輪詢 – BadFeelingAboutThis 2012-08-16 16:31:28
這真是太棒了。你能分解線路並解釋他們在做什麼嗎?像什麼是(a:*,b:*)和排序等。 – 2012-08-16 16:59:45