Javascript每次都会生成随机唯一编号

Gre*_*son 2 javascript arrays

好的,所以我需要在1-10之间创建四个随机生成的数字,它们不能相同.所以我的想法是将每个数字添加到一个数组但是我如何检查数字是否在数组中,如果是,重新生成数字,如果它没有将新数字添加到数组中?

所以基本上它会去,

1.创建新数字并添加到数组2.创建第二个新数字,检查它是否已存在,如果它不存在,则添加到数组.如果它确实存在,重新创建新号码,再次检查等... 3.同上,依此类推.

Mat*_*att 9

你想要一个所谓的"随机抓包".考虑一下你有一个"袋子"的数字,每个数字只在这个包中代表一次.你可以根据需要随机抽出数字.

这里介绍的一些其他解决方案的问题是它们随机生成数字,并检查它是否已被使用.这将需要更长的时间和更长的时间才能完成(理论上可以达到无限长的时间量),因为你在等待随机()函数返回你不已经有一个值(和它不具备这样做,它可以永远给你1-9,但永远不会回报10).

有很多方法可以实现抓包式解决方案,每种解决方案都有不同程度的成本(但是,如果正确完成,将永远不会无限).

您问题的最基本解决方案如下:

var grabBag = [1,2,3,4,5,6,7,8,9,10];

// randomize order of elements with a sort function that randomly returns -1/0/1
grabBag.sort(function(xx,yy){ return Math.floor(Math.random() * 3) - 1; })

function getNextRandom(){
    return grabBag.shift();
};

var originalLength = grabBag.length;
for(var i = 0; i < originalLength; i++){
    console.log(getNextRandom());
}
Run Code Online (Sandbox Code Playgroud)

这当然对原始的grabBag阵列具有破坏性.而且我不确定那种"真正随机"是多少,但对于许多应用来说它可能"足够好".

稍微不同的方法是将所有未使用的元素存储在数组中,随机选择一个索引,然后删除该索引处的元素.这里的成本是每次删除元素时创建/销毁数组的频率.