用不重复的随机数填充数组
Populate array with non repeating random numbers
所以我有一个名为arr
的数组。
我想用四个随机数填充它:
for (var i = 0; i < 4; i++) {
arr[i] = Math.floor(Math.random() * 10);
}
如果返回值为[4, 2, 3, 4]
的数组。如何检查重复项,并重新计算一个不等于数组中已存在的任何其他值的随机数?
此外,如果有更好的方法来实现这一点,我也很想学习/了解这种方法。
此外,如果有更好的方法来实现这一点,我也很想学习/了解这种方法。
有。
如果你需要唯一的值,生成一个规则的序列数组[1,2,4](或者你需要多长时间),然后用它来填充第二个数组,方法是从第一个数组中依次提取随机元素(从而增加数组2,缩小数组1):
var a1 = [];
for (var i=0; i<4; i++) { a1.push(i); }
var a2 = [];
while (a1.length) {
var pos = Math.random()*a1.length;
var element = a1.splice(pos, 1)[0];
a2.push(element);
}
// a2 is now an array with a random permutation of the elements of a1
splice
调用移除从位置pos
开始的具有(在本例中)1个元素的子数组,因此a1
变得越来越短,直到它为空,此时a2
将是唯一值的排列数组。
如果我们从a1 = [0,1,2,3]
开始,那么在运行之后,a2
可以是24个可能序列中的任何一个,具有保证的唯一值,因为这就是我们开始的,只是以随机顺序。
您正在寻找的是一种从整数数组[0..9]中随机采样的方法。您可以使用几种算法来实现这一点,例如一种简单的储层采样算法。
如果您想要一个数组,它包含从1到n的任意数量的随机数字,我认为更可行的方法是生成一个包含从1至n的所有数字的数组,然后按照此处所述对其进行混洗。
然后,您可以在洗牌后继续拼接阵列,将其缩短到所需的长度。
这两个步骤都具有O(1)或O(n)的复杂性,这比测试每个插入或修改从中提取数字的值池要好得多。
我可能会为循环创建一个函数。
function getNumber(arr){
var num = Math.floor(Math.random() * 10);
if(arr.indexOf(num) < 0){
return num;
} else {
getNumber(arr);
};
};
然后你会做:
var arr = [];
for (var i = 0; i < 4; i++) {
arr[i] = getNumber(arr);
}
相关文章:
- 如何设置html元素填充的动画
- 如何使用jquery在填充自动完成的值后使文本框只读
- 如何通过ajax刷新JSF填充的javascript变量
- 用与线条相同的颜色填充多折线图上的点
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 如何在javascript中获得与特定数字相等的随机数
- 带有填充属性的SVG矩形显示在包含元素的上方插入框阴影
- 用我的json数据填充JQuery DataTable
- Javascript动态变量(添加了随机数)
- 使用 jQuery 检查所有值是否为空或已填充
- 为什么不't我的变量在我的控制器中填充后在我的视图中呈现
- 如何让typeahead在我的搜索栏中填充自定义参数
- 如何使用JSON字符串中的jQuery填充下拉框
- 动态填充两个下拉菜单
- 如何将CSS(特别是填充/边距)应用于select下拉菜单的选项或optgroup
- spine.js在启动时填充模型实例
- 在 img src 中填充随机数
- 使用jQuery用随机数组元素填充20个文本框
- 使用Javascript中的随机数填充文本字段中的值
- 如果输入字段为空,则用随机数填充