得到一个随机数不超过两次 - 其他解决方案

get a random Number no more then twice - Other Solution

我正在尝试获取 0 到 2 (0,1,2) 范围内的随机数, 但我只想连续获得这个数字 2 次,之后它需要是另一个数字。像这样:

rand = 1(第一次),rand = 1(第二次),rand = 1(第三次 -> 我们去选择其他数字(0 或 2))

目前我找到了一个方法,但我有一种不好的感觉,它不是解决这个问题的最佳方法。

所以我有这个:

private var previousNumber:int = -1;
    private var sameNumber:int = 0;
    private var positions:Array = [0,1,2];

    private function randomNumber(maxNumber:int, minNumber:int = 0, calledFromInside:Boolean = false):int
    {
        var rand:int;
        var numberToReturn:int;

        if(!calledFromInside) 
        {
            rand = Math.floor(Math.random() * (1 + maxNumber - minNumber) + minNumber);
            if( previousNumber == rand )
            {
                if( sameNumber < 2 )
                {
                    sameNumber++;
                    previousNumber = rand;
                    numberToReturn = positions[ rand ];
                }
                else
                {
                    positions.splice( rand, 1);
                    sameNumber = 0;
                    randomNumber(maxNumber, minNumber, true);
                }
            }
            else
            {
                previousNumber = rand;
                numberToReturn = positions[ rand ];
            }
        }
        else 
        {
            maxNumber--;
            rand = Math.floor(Math.random() * (1 + maxNumber - minNumber) + minNumber);
            numberToReturn = positions[ rand ];
            positions = [0,1,2];
        }
        return numberToReturn;
    }

如你所愿,你可以使用计数器计算每个值的世代数,然后你可以接受它或请求另一个值。

在我的示例中,我使用了一个按钮来显示生成的随机值:

// save the generations count of every values
var count:Object = {0: 0, 1: 0, 2: 0};

btn.addEventListener(
    MouseEvent.CLICK, 
    function(e:MouseEvent):void { 
        trace(get_random_value());
    }
)

function get_random_value():int 
{
    var good:Boolean = false;
    var value:int;

    while(!good){

        // generate our random value, this instruction is good only for values between 0 and 2 for other values :
        // value = Math.floor(Math.random() * (1 + max_value - min_value) + min_value);
        value = Math.floor(Math.random() * 3);

        // if we have got this value once, so take it
        if(count[value] < 2)
        {
            good = true;

            // count ++
            count[value] ++;

            // if there is another value which has reached the max successive generations number (2) so initialize its count number
            init_others(value);

        // otherwise, we got this value twice, so try to get another value
        } else {            
            good = false;
        }
    }
    return value;
}

// initialize counter of values if equals 2
function init_others(me:int):void 
{
    for(var val in count){
        if(val != me && count[val] == 2) count[val] = 0;
    }
}

希望能帮到你。

每次遇到第三场比赛时,您只需要重新掷出一个随机数即可。

private function randomNumber(maxNumber:int, minNumber:int = 0):int
{
    var rand:int= Math.floor(Math.random() * (1 + maxNumber - minNumber) + minNumber);
    if (rand==previousNumber) 
    {
        sameNumber++; // matches previous
        while (sameNumber>2) // more than two in a row - uh oh
        { // start rolling until it'll be a different number
            rand= Math.floor(Math.random() * (1 + maxNumber - minNumber) + minNumber);
            // reroll the number, just that, no recursion
            if (rand!=previousNumber) 
            { // we rolled a different number, clean up
                sameNumber=1;
                previousNumber=rand;
                return rand;
            }
        }
    } else {
        sameNumber=1;
        previousNumber=rand;
        return rand;
    }
}