Actionscript 3 获得一个不超过两次的随机数-其他解决方案
我试图得到一个从0到2(0,1,2)的随机数, 但我只想得到连续两次的数字,然后需要另一个数字。像这样: rand=1(第一次),rand=1(第二次),rand=1(第三次->我们去选择其他数字(0或2)) 目前我想出了一个办法,但我有一种不好的感觉,那就是它不是解决这个问题的最好办法 所以我有这个: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
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,那么我们必须得到另一个,仅此而已!但最重要的是你有一个解决问题的办法。