0

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

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

4 回答 4

2

这是一种非常快速的方法,因为您不必检查之前是否已选择它:

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

--创建一个你想要选择多少的循环。

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

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

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

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

使用此过程,您将永远不必检查号码是否唯一。您只需要检查数组是否为空,这意味着您已经选择了每个数字一次。

更快,因为您不必在第二次、第三次或第四次等时间生成随机数。

于 2013-10-26T22:19:19.230 回答
1

由于您的算法设计,它在接近尾声时变得低效。在处理随机数时,“循环并重新选择”是一种众所周知的反模式。

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

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

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

正如另一个答案所说,而不是选择数字并且必须循环- 生成数字,然后在该列表中选择索引来“打乱它们”。这就是他们用卡片的方式......

于 2013-10-26T22:57:48.813 回答
1

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

  • 它选择从数组的最后一个元素开始的枢轴(由你决定,你可以从第一个元素开始,只需修改 while 循环)

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

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

顺便说一句,它可以随机选择相同的元素,但如果你想获得更好的结果,只需多次调用函数,这不是你洗牌的问题......

我从这里拿了代码

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;
}
于 2013-10-26T23:01:25.847 回答
0

制作一个数字从 1 到 160 的数组。在 0 到 159 之间随机排列。取随机索引并放在最后。下次在 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;}
于 2013-10-26T23:14:44.827 回答