Javascript 确保我的随机值数组不';不包含重复的值

Javascript 确保我的随机值数组不';不包含重复的值,javascript,jquery,random,Javascript,Jquery,Random,我想知道是否有人可以建议我如何确保从另一个数组生成的随机数组不包含重复值,是否要确保arr2包含唯一值 JS var限值=5, i=0, arr1=[12,14,67,45,8,45,56,8,33,89], arr2=[]; 对于(i;i

我想知道是否有人可以建议我如何确保从另一个数组生成的随机数组不包含重复值,是否要确保arr2包含唯一值

JS

var限值=5,
i=0,
arr1=[12,14,67,45,8,45,56,8,33,89],
arr2=[];
对于(i;i
可能有一个if语句比较arr1[rand]和arr2[i]?

简单的
O(n^2)
解决方案就是简单地检查每个元素,看看数组中的任何其他位置是否具有相同的值

可以使用hashset数据结构实现线性时间解决方案。您可以使用对象在JavaScript中破解一个:

var set = {};
set['0'] = true;
set['1'] = true;

if(set.hasOwnProperty('0')) {
    alert("duplicate 0!");
}
如果数字是整数且相对较小,则可以在布尔值数组中跟踪它们。

试试这个

for ( i; i < limit; i++ ){
        var rand = Math.floor((Math.random()*9)+1);
        for(j=0; j <  arr1.length; j++)
           if(rand == arr1[j]
           { 
                blnfound = true;
                break;
           }
        if(!blnfound)
        arr2.push( arr1[rand] );
    }
(i;i{ var rand=Math.floor((Math.random()*9)+1); 对于(j=0;j创建一个临时数组,该数组是仅包含唯一值的arr1的副本:

// Copy unique values in arr1 into temp_arr
var temp_obj = {}, temp_arr = [], i;
for(i = arr1.length; i--;)
    temp_obj[arr1[i]] = 1;
for(i in temp_obj) 
    temp_arr.push(i);
然后,每次将该元素添加到
arr2
时,您都可以从
temp\u arr
中删除该元素。由于复制时使用了对象键,因此我们有字符串,因此在推入
arr2
时,可以使用
+
将其转换回数字:

arr2.push(+temp_arr.splice(rand, 1)[0]);
您还应将随机数的选取方式更改为:

var rand = Math.floor(Math.random()*temp_arr.length);
全部代码:

var limit = 5,
  arr1 = [12, 14, 67, 45, 8, 45, 56, 8, 33, 89],
  arr2 = [],
  rand, 
  temp_obj = {},
  temp_arr = []
  i;

// Copy unique values from arr1 into temp_arr
for(i = arr1.length; i--;)
    temp_obj[arr1[i]] = 1;
for(i in temp_obj)
    temp_arr.push(i);;

// Move elements one at a time from temp_arr to arr2 until limit is reached
for (var i = limit; i--;){
    rand = Math.floor(Math.random()*temp_arr.length);
    arr2.push(+temp_arr.splice(rand, 1)[0]);
}

console.log(arr2);

有关Fischer/Yates shuffle的详细信息,请参阅。对于您的问题,您可以使用shuffled牌组的前五个元素。

使用
jQuery.inArray
函数:)


谢谢Paul,但我需要保留arr1中的值,它会更新rand,尽管
arr1
中有重复项,所以删除拾取的元素并不能确保
arr2
中没有重复项@Guffa啊,我看到了,现在正在更新我的答案。@styler我已经更新了我的答案,这样它将保持
arr1
不变,并且在
arr2
Hi Paul中只有唯一的值,这看起来不错!但有一个问题,我认为for循环必须有一个起始值、结束值和增量?@styler~-按位补码;!-否定;看看
var limit = 5,
  arr1 = [12, 14, 67, 45, 8, 45, 56, 8, 33, 89],
  arr2 = [],
  rand, 
  temp_obj = {},
  temp_arr = []
  i;

// Copy unique values from arr1 into temp_arr
for(i = arr1.length; i--;)
    temp_obj[arr1[i]] = 1;
for(i in temp_obj)
    temp_arr.push(i);;

// Move elements one at a time from temp_arr to arr2 until limit is reached
for (var i = limit; i--;){
    rand = Math.floor(Math.random()*temp_arr.length);
    arr2.push(+temp_arr.splice(rand, 1)[0]);
}

console.log(arr2);
var limit = 5,
arr1 = [12, 14, 67, 45, 8, 45, 56, 8, 33, 89],
l = arr1.length,
arr2 = [];

while( limit ){
      var tmp = arr1[  Math.random() * l | 0 ];  
      // for unsigned numbers '|0' construction works like Math.floor  
      if( !~$.inArray( tmp, arr2 ) ) { 
       // if not found $.inArray returns -1 ( == ~0 ), then !~-1 == true   
          limit--;
          arr2[ arr2.length ] = tmp;
      } 
} 
console.log( arr2 );