好的,所以我需要在 1-10 之间创建四个随机生成的数字,并且它们不能相同。所以我的想法是将每个数字添加到一个数组中,但我如何检查该数字是否在数组中,如果是,则重新生成该数字,如果不将新数字添加到数组中?
所以基本上它会去,
1.创建新数字并添加到数组 2.创建第二个新数字,检查它是否已经存在,如果不存在,添加到数组中。如果确实存在,请重新创建新号码,再次检查等... 3.同上等等。
最佳答案
您想要所谓的“随机抓包”。假设你有一个数字“包”,每个数字在这个包中只出现一次。您可以根据需要随机取出数字。
这里介绍的其他一些解决方案的问题是它们随机生成号码,并检查它是否已被使用。这将需要越来越长的时间才能完成(理论上最多需要无限长的时间),因为您正在等待 random() 函数返回一个您还没有的值(而且它没有 这样做,它可以永远给你 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());
}
这当然是破坏了原来的grabBag数组。而且我不确定这种排序有多“真正随机”,但对于许多应用程序来说,它可能“足够好”。
一种略有不同的方法是将所有未使用的元素存储在一个数组中,随机选择一个索引,然后删除该索引处的元素。这里的成本是每次删除元素时创建/销毁数组的频率。
关于Javascript 每次都生成随机的唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7045615/