请帮我简化这个随机生成功能

时间:2013-10-26 22:01:05

标签: actionscript-3 function random numbers

所以我有这些代码行生成随机数,实际上是一个唯一的随机数,但是当你必须生成160个数字时,这个代码不是很好。每个生成的数字都会添加到一个数组中,每次生成一个新数字时,都会检查该数组,如果该数字在数组中,则如果数字不在数组中,则生成另一个数字。请帮我简化这段代码,因此它不需要那么多内存,而且:一切正常,直到随机生成器重新开始157然后它破裂......我似乎不知道为什么...... 请帮我把它做得更好!!! THX

var randomNum:int = 0;
var randomGen:int = 0;
var myArray:Array = [];

function setup()
{
displayRandomNumber();

var_corect.addEventListener(MouseEvent.CLICK, randomNumberEvent);
}
setup();

function randomNumberEvent(e:MouseEvent)
{
displayRandomNumber();
}
function displayRandomNumber()
{
randomGen = randBetween(1, 160);
randomNumberText.text = randomGen.toString();
trace ('Number is:'+ randomNumberText.text);
if(myArray.indexOf(randomGen) == -1){
myArray.push(randomGen);

}else{
displayRandomNumber()
    }
trace("my array" + myArray);

}

function randBetween(min:int, max:int):int 
{
return Math.round(Math.random() * (max - min) + min);
}

4 个答案:

答案 0 :(得分:2)

这是一种非常快速的方法,因为你不必检查它是否在之前被选中:

- 创建一个包含168个数字的数组 - 或者您想要多少数字以及任何范围。

- 为您想要选择的数量创建一个循环。

- 每次迭代随机选择一个并从数组中拼接 - 例如:

var randomIndex:int = Math.random() * pool.length;

var choice:int = pool.splice(randomIndex,1).pop();

- 如果数组为空,请创建一个新数组并重复相同的过程,如果这是你想要做的。

使用此过程,您无需检查该号码是否唯一。您只需检查数组是否为空,这意味着您已选择每个数字一次。

要快得多,因为你永远不必在第二,第三或第四等时间生成随机数。

答案 1 :(得分:1)

由于您的算法设计,它在接近结尾时效率低下。在处理随机数时,“循环和重新选择”是一个相当着名的反模式。

考虑:最后,随机选择不存在的最后一个数字的几率仅为1/168 - 所有其他值必须循环并重新选择。

此外,扫描阵列的成本是仅扫描一个元素的168倍。

总之,你的最后一次迭代比第一次迭代慢大约28,224次。倒数第二个将慢14028倍。倒数第三将慢9296倍。迭代成本与(168 /(168-N))* N成比例。

正如另一个答案所说,而不是选择数字&必须循环 - 生成数字,然后选择该列表中的索引以“混洗它们”。这就是他们用卡片做的事情......

答案 2 :(得分:1)

你可以查看这个算法(Fisher-Yates shuffle)它看起来非常有用。

  • 它选择了数组的起始位置(你可以从第一个元素开始修改while循环)

  • 使用数组中的pivot索引选择随机元素

  • 并从数组中重新定位这两个元素

顺便说一句,它可以随机选择相同的元素,但如果你想要获得更好的结果只是多次调用函数,那么你就是洗牌了。

我从here

获取了代码
function shuffle(array) {
  var m = array.length, t, i;

  // While there remain elements to shuffle…
  while (m) {

    // Pick a remaining element…
    i = Math.floor(Math.random() * m--);

    // And swap it with the current element.
    t = array[m];
    array[m] = array[i];
    array[i] = t;
  }

  return array;
}

答案 3 :(得分:0)

创建一个数字从1到160的数组。在0到159之间随机。取randomed索引并放在最后。下次在0到158之间随机,并将该索引放在最后。随机0到157等等......

function shuffle(theArray:Array) {
var m=theArray.length; var num:Int; var i:int;
while (m) {

i = Math.floor(Math.random() * m--);
num=index[i];
theArray.splice(i,1);
theArray.push(num);}

return theArray;}