Javascript 每次都生成随机的唯一数字

标签 javascript arrays

好的,所以我需要在 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/

相关文章:

python - 如何在有和没有重叠的情况下将 numpy 数组拆分为固定大小的 block ?

javascript - 多个jQuery事件,获取当前执行事件

javascript - 如何将图像添加到 JQuery 对话框

javascript - JSF丰富:scrollableDataTable rowcount on javascript popop

javascript - 如何在fabricjs中使用嵌入式图像base64将 Canvas 转换为SVG

php - 使用动态准备语句更新表

javascript - 如何使用 gulp-inject 将文件的内容插入到我的 index.html 中?

php - 具有两个数组的多个 foreach

c - 多线程和参数混合

java - JTextField 中的数字数组 - Java