所以我有这些代码行生成随机数,实际上是一个唯一的随机数,但是当你必须生成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);
}
答案 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;}