防止math.random形式选择相同数字两次的最简单方法(AS3)

时间:2016-03-11 07:50:22

标签: actionscript-3 math random

我有一个随机数变量定义如下

var rannum:Number = Math.floor(Math.random()*50+1);

然后我有一个触发器,每次点击一个按钮时都会调用一个新的随机数

ranbtn.addEventListener(MouseEvent.CLICK, reran);
function reran (event:MouseEvent):void
{  
  rannum = Math.floor(Math.random()*50+1); 
}

我想阻止选择相同的随机数,直到所有数字都被选中然后可能重新开始? 我发现了一些像这样的线程,但没有一个是我需要的

3 个答案:

答案 0 :(得分:3)

您需要创建一个可能值的数组,每次从数组中检索随机索引以使用其中一个值时,都会将其从数组中删除。这里有一个简单的javascript示例。

var uniqueRandoms = [];
var numRandoms = 50;
function makeUniqueRandom() {
    // refill the array if needed
    if (!uniqueRandoms.length) {
        for (var i = 0; i < numRandoms; i++) {
            uniqueRandoms.push(i);
        }
    }
    var index = Math.floor(Math.random() * uniqueRandoms.length);
    var val = uniqueRandoms[index];

    // now remove that value from the array
    uniqueRandoms.splice(index, 1);

    return val;

}

我找到了另一个选项,你可以声明一个整数数组:[1,2,3,4 ... 50]并随机排序。

 var sorted:Array = [];

    for(var i:int = 0; i < 50; i++){
        sorted.push(i);
    }

    //I'm making a copy of sorted in unsorted        
    var unsorted:Array = sorted.slice();

    //Randomly sort 
    while(sorted.join() == unsorted.join()){    
        unsorted.sort(function (a:int, b:int):int { return Math.random() > .5 ? -1 : 1; });
    }

答案 1 :(得分:0)

如果您获得了一个选定的数字,您可以添加一个,直到它没有被选中。

答案 2 :(得分:0)

  1. 创建1到50之间的整数列表。
  2. 从列表中选择一个随机整数并将其删除。
  3. 如果没有剩余整数(在50个选择之后),请重复步骤1.
  4. 代码:

    function createRangeOfIntegers(from:int, to:int):Vector.<int> {
        if (from >= to) throw new ArgumentError("Invalid arguments");
        var integers:Vector.<int> = new <int>[];
        for (var i:int = from; i <= to; i++) {
            integers.push(i);
        }
        return integers;
    }
    
    function getRandomInteger(integers:Vector.<int>):int {
        var index:int = Math.random() * integers.length;
        var integer:int = integers.splice(index, 1)[0];
        return integer;
    }
    

    示例:

    // create all the possible integers
    var integers:Vector.<int> = createRangeOfIntegers(1, 50);
    
    // select a random integer
    var random:int = getRandomInteger(integers);
    
    // When you've selected all integers you can start over
    if (integers.length == 0)
        integers = createRangeOfIntegers(1, 50);