Javascript 从1000个元素的数组中随机抽取50个唯一元素?

Javascript 从1000个元素的数组中随机抽取50个唯一元素?,javascript,arrays,random,Javascript,Arrays,Random,从1000个元素的数组中获得50个随机唯一元素的最简单方法是什么 text = new Array(); for(i=0;i<1000;i++){ text[i]=i; } //array populated // now I need to get 50 random unique elements from this array. text=新数组(); 对于(i=0;iMath.random()*1000 生成50个随机数,并将其用作数组中的位置。中解释的好算法(在C中,但在J

从1000个元素的数组中获得50个随机唯一元素的最简单方法是什么

text = new Array();
for(i=0;i<1000;i++){ text[i]=i; }   //array populated
// now I need to get 50 random unique elements from this array.
text=新数组();
对于(i=0;iMath.random()*1000


生成50个随机数,并将其用作数组中的位置。

中解释的好算法(在C中,但在JS中也可以轻松实现)

显而易见的(对我来说)方法是洗牌数组,然后取前五十个元素。洗牌数组的方法很好,然后你可以洗牌前五十个元素。这保证了元素是唯一的

因此,使用此处的函数:

fisherYates(text);
text = text.slice(0, 50);

仔细研究一下,我想这对你很有用。

如果你指的是独特的价值:

var old_arr = [0,1,2,3,4,5,6,7,8,9], new_array = [];

for (var i = 0; i < 5; i++) {
    var rand_elem = old_arr[Math.floor(Math.random() * old_arr.length)];

    if (arrIndex(old_arr[rand_elem], new_array) == -1) {
        new_array.push(rand_elem);
    } else {
        i--;
    }
}

function arrIndex(to_find, arr) {//own function for IE support
    if (Array.prototype.indexOf) {
        return arr.indexOf(to_find);
    }
    for (var i = 0, len = arr.length; i < len; i++) {
        if (i in arr && arr[i] === to_find) {
            return i;
        }
    }
    return -1;
}
var old_arr=[0,1,2,3,4,5,6,7,8,9],new_array=[];
对于(变量i=0;i<5;i++){
var rand_elem=old_arr[Math.floor(Math.random()*old_arr.length)];
if(arrIndex(旧的arr[rand\u elem],新的arr数组)=-1){
新的数组推送(随机元素);
}否则{
我--;
}
}
函数arrIndex(to_find,arr){//支持IE的自有函数
if(Array.prototype.indexOf){
返回arr.indexOf(to_find);
}
对于(变量i=0,len=arr.length;i
如果您指的是唯一索引:

  • 生成随机索引并将索引存储在数组中,并进行检查以防止重复
  • 获取数组元素后开始删除它们(如果缓存长度,则可能会出现问题,因此不要)
    • var-arr=[];
      而(平均长度<51){
      var ind=Math.floor(Math.random()*1000);
      如果(!(arr中的ind))
      方位推力(ind)
      }
      
      数组arr中有50个随机唯一的数字,可以用作索引

      编辑:

      正如@ajax333221所提到的,前面的代码不能从数组中获取唯一的元素,以防它包含重复的元素。因此,这是修复方法:

      var result_arr = [];
      while(result_arr.length < 51){
          var ind = Math.floor(Math.random()*1000);
          if(text[ind] && !(text[ind] in result_arr))
              result_arr.push(text[ind]);
      }
      
      var结果_arr=[];
      而(结果_arr.length<51){
      var ind=Math.floor(Math.random()*1000);
      if(结果中的文本[ind]&&!)
      结果_arr.push(文本[ind]);
      }
      

      作为“文本”,数组中填充了1000个值,这假定您指的是随机索引,而不是具有唯一值的索引

      一种方法是复制数组并删除使用的数组:

      function getRandomIndexes( arr, cnt){
          var randomArr = [],
              arrCopy = arr.slice(),
              i, 
              randomNum ;
          for (i=0;i<arrCopy.length;i++) {
              randomNum = Math.floor( arrCopy.length * Math.random());
              randomArr = randomArr.concat(  arrCopy.splice(randomNum ,1) );
          }    
          return randomArr;
      }
      
      var myNums = [], i, randSet;
      for (i=0;i<10;i++){
          myNums.push(i);
      }
      randSet = getRandomIndexes(myNums, 5);
      
      函数getRandomIndexes(arr、cnt){ var randomArr=[], arrCopy=arr.slice(), 我 随机数;
      对于(i=0;我在这里做一些假设。我假设你正在检查你的随机值,就像我假设你知道如何存储这50个数字,而我不给你看:)好主意!但是,只有在1000个元素是唯一的情况下,它才能工作。@VisioN在这种情况下,请确保
      text
      中的元素是唯一的。有很多函数可以精确地做到这一点,例如。VisioN是对的,而且洗牌1000个len数组只需花费50个周期。你是什么意思“唯一元素”指的是唯一索引或索引中的唯一值?-1 a)不能正确生成唯一编号,b)即使你修复了它,如果1k数组包含重复的唯一编号也是无用的。如果你是对的,我误解了这个问题,我只是想得到50个唯一索引编号。为什么你说它不能正确生成唯一编号???@d因为
      if(!(ind in arr))
      不是要执行的正确检查,它检查数组中是否包含索引(不是值)。因此,如果在第一个循环中添加23,则23可能会复制接下来的22个循环。您可能希望在我第一次看到
      arr.slice()
      时使用indexOf insteadInterest(我总是看到
      arr.slice(0)
      ),但我想它也应该起作用
      function getRandomIndexes( arr, cnt){
          var randomArr = [],
              arrCopy = arr.slice(),
              i, 
              randomNum ;
          for (i=0;i<arrCopy.length;i++) {
              randomNum = Math.floor( arrCopy.length * Math.random());
              randomArr = randomArr.concat(  arrCopy.splice(randomNum ,1) );
          }    
          return randomArr;
      }
      
      var myNums = [], i, randSet;
      for (i=0;i<10;i++){
          myNums.push(i);
      }
      randSet = getRandomIndexes(myNums, 5);
      
      function getRandomIndexes( arr, cnt){
          var randomArr = [],
              usedNums = {},
              x;
          while (randomArr.length<cnt) {
              while (usedNums[x]===true || x===undefined) {
                  x = Math.floor( Math.random() * arr.length);
              }
              usedNums[x] = true;
              randomArr.push( arr[x] );
          }
          return randomArr;
      }
      
      var myNums = [], i, randSet;
      for (i=0;i<10;i++){
          myNums.push(i);
      }
      randSet = getRandomIndexes(myNums, 5);