得到一个随机数不超过两次 - 其他解决方案
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;
}
}
我正在尝试获取 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;
}
}