Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 获得一个不超过两次的随机数-其他解决方案_Actionscript 3_Logic - Fatal编程技术网

Actionscript 3 获得一个不超过两次的随机数-其他解决方案

Actionscript 3 获得一个不超过两次的随机数-其他解决方案,actionscript-3,logic,Actionscript 3,Logic,我试图得到一个从0到2(0,1,2)的随机数, 但我只想得到连续两次的数字,然后需要另一个数字。像这样: rand=1(第一次),rand=1(第二次),rand=1(第三次->我们去选择其他数字(0或2)) 目前我想出了一个办法,但我有一种不好的感觉,那就是它不是解决这个问题的最好办法 所以我有这个: private var previousNumber:int = -1; private var sameNumber:int = 0; private var position

我试图得到一个从0到2(0,1,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;
    }
private-var-previousNumber:int=-1;
私有变量sameNumber:int=0;
私有变量位置:数组=[0,1,2];
私有函数randomNumber(maxNumber:int,minNumber:int=0,calledFromInside:Boolean=false):int
{
var-rand:int;
var numberToReturn:int;
如果(!从内部调用)
{
rand=Math.floor(Math.random()*(1+maxNumber-minNumber)+minNumber);
如果(上一个编号==兰德)
{
if(样本数<2)
{
sameNumber++;
previousNumber=兰特;
numberToReturn=位置[rand];
}
其他的
{
拼接位置(兰特,1);
sameNumber=0;
随机数(maxNumber、minNumber、true);
}
}
其他的
{
previousNumber=兰特;
numberToReturn=位置[rand];
}
}
其他的
{
最大数--;
rand=Math.floor(Math.random()*(1+maxNumber-minNumber)+minNumber);
numberToReturn=位置[rand];
位置=[0,1,2];
}
返回号码返回;
}

要执行所需操作,您可以使用计数器计算每个值的代数,然后您可以接受它或请求另一个值

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

// 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;
    }
}
//保存每个值的代数
变量计数:对象={0:0,1:0,2:0};
btn.addEventListener(
MouseEvent.CLICK,
函数(e:MouseEvent):void{
跟踪(获取随机值());
}
)
函数get_random_value():int
{
var-good:Boolean=false;
var值:int;
而(!好){
//生成我们的随机值,对于其他值,此指令仅适用于0和2之间的值:
//value=Math.floor(Math.random()*(1+最大值-最小值)+最小值);
值=Math.floor(Math.random()*3);
//如果我们得到这个值一次,那么接受它
如果(计数[值]<2)
{
好=真;
//计数++
计数[值]+;
//如果有另一个值已达到最大连续代数(2),则初始化其计数
初始其他(值);
//否则,我们得到这个值两次,所以尝试得到另一个值
}否则{
好=假;
}
}
返回值;
}
//如果等于2,则初始化值的计数器
函数init_others(me:int):void
{
for(计数中的var val){
如果(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;
    }
}

你能解释一下你到底需要什么吗?你所说的“连续2次”是什么意思?连续2次意味着我不想得到第二个数字,不想超过连续2次,当它再次尝试得到第二个数字(第三次)时,我希望它返回另一个数字,这与第二个不同。基本上我做了,但是。。。。我认为这不是正确的方法-我杀的太多了。所以你需要6个随机代,每个值0,1和2两次?:D nooo,基本上我用它来创建元素并将其放置在屏幕上的某个位置。想象一下,它们总是在屏幕的顶部边缘生成,道指下跌,现在0表示屏幕的左上角,1表示屏幕的中上角,2表示屏幕的右上角。所以我永远不想在一个位置产生3个项目(连续)。它们产卵多少次并不重要,但让我们说——无限但为什么你从一开始就不告诉我们,这更容易理解;)我很感激你的回答,但这对我来说有点难,而且我认为上面的解决方案更简单。我不知道这个方法有多难;)我们计算每个随机值的数目,如果它是2,那么我们必须得到另一个,仅此而已!但最重要的是你有一个解决问题的办法。