在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 隨機(jī)產(chǎn)生0到n之間的k個(gè)不相等整數(shù)

隨機(jī)產(chǎn)生0到n之間的k個(gè)不相等整數(shù)

var fun2 = function(n, k) {
      var returnArr = []
      returnArr[0] = Math.ceil(Math.random() * n)
      var template = 0
      for (let i = 1; i < k; i ++) {
        template = Math.ceil(Math.random() * n)
        for(let j = 0; j < returnArr.length; j ++) {
          if(template === returnArr[j]) {
            i --
            break
          }
          else { returnArr.push(template) }
        }
      }
      return returnArr
    }
    fun2(10,5)

clipboard.png
為撒呢?

回答
編輯回答
別硬撐

1, 產(chǎn)生0~n的數(shù)組range(n)。
2, 產(chǎn)生同長度的隨機(jī)數(shù)。
3, 用產(chǎn)生的隨機(jī)數(shù)作為key去排序range(n)
4, 取出前k個(gè)。其實(shí)想從哪個(gè)位置取都可以。

var arr = new Array()
for (var i = 0; i< 10; i++) {
    arr.push({k:Math.random(),v:i});
}
var sortbykey = function (a,b) {return a.k-b.k;}

arr.sort(sortbykey);

for (var i = 0; i< 5; i++) {
    console.log(arr[i].v);
}

還是有random.shuffle

2017年6月22日 06:04
編輯回答
疚幼

if(template === returnArr[j])這句是不對(duì)的,因?yàn)樵偕傻目赡苓€是不符合,所以這里需要改成while

另外將值push到數(shù)組里的操作可以移到上一個(gè)for循環(huán)里進(jìn)行,于是整個(gè)就:

var fun2 = function(random_max, random_num) {
    var returnArr = [];
    returnArr.push(Math.ceil(Math.random() * random_max));
    var temp = 0;
    for (var i = 1; i < random_num; i ++) {
        do {
            temp = Math.ceil(Math.random() * random_max);
            repeatFlag = false;
            for (var j = 0; j < returnArr.length; ++j) {
                if (temp === returnArr[j]) {
                    repeatFlag = true;
                    break;
                }
            }
        } while (repeatFlag == true);
        
        returnArr.push(temp)
    }
    return returnArr
}
    
    
console.log(fun2(10,5))
2017年2月15日 03:00
編輯回答
絯孑氣

random+indexOf

2017年3月6日 10:08
編輯回答
我不懂

var fun2 = function(n, k) {

  var returnArr = []
  returnArr[0] = Math.ceil(Math.random() * n)
  var template = 0
  for (let i = 1; i < k; i ++) {
    template = Math.ceil(Math.random() * n)
    var len = returnArr.length,
        isEqual = false
    for(let j = 0; j < len/*returnArr.length*/; j ++) {
      if(template === returnArr[j]) {
        i --
        isEqual = true
        break
      }
    }
    if(!isEqual) {
      returnArr.push(template)
    }
  }
  return returnArr
}
2018年6月4日 16:37
編輯回答
愛礙唉

不知道題主還在跟蹤這個(gè)問題沒?
仔細(xì)看了代碼后發(fā)現(xiàn)問題出在

returnArr = [0];
template = Math.ceil(Math.random() * n); // 1、假設(shè) template => 5
// 內(nèi)循環(huán)
for(let j = 0; j < returnArr.length; j ++) {
  if(template === returnArr[j]) { // 3、 10 === returnArr[1] 
    i --; // 4、外循環(huán),但是步驟二已經(jīng)push,外循環(huán)將在這個(gè)墻角「走不出去」
    break;
  } else { 
    returnArr.push(template); // 2、returnArr => [0, 5] 
    // => 并沒跳出,returnArr 長度+1, 繼續(xù) j++
  }
}

其實(shí),找到這個(gè)問題,題主就有辦法解決!

function rand (max, len) {
    let arr = [];
    // 產(chǎn)生一個(gè)隨機(jī)數(shù)
    let tmp = Math.ceil(Math.random() * max);
    arr[0] = tmp;
    
    // 處理 len,由于你隨機(jī)最多l(xiāng)en種情況,so...
    len = len > max ? max : len;
    
    for (let i = 1; i < len; i++) {
        tmp = Math.ceil(Math.random() * max);
        // 檢測是否存在
        if (arr.indexOf(tmp) > -1) {
            i--;
            continue;
        }
        
        arr.push(tmp);
    }
    
}
2017年3月19日 10:50
編輯回答
雅痞

都在秀解發(fā),我來說下題主代碼為啥會(huì) 死循環(huán) + 爆內(nèi)存

因?yàn)槟阍跀?shù)組for循環(huán)里又push東西到數(shù)組里了啊,這個(gè)動(dòng)作很危險(xiǎn),弄不好就死循環(huán)了。不巧你這個(gè)代碼就撞上了。。。

加斷點(diǎn)單步調(diào)試一下你就會(huì)發(fā)現(xiàn),題主的循環(huán)跳不出去啊,因?yàn)楸緛硌h(huán)要結(jié)束了,又push一個(gè)元素進(jìn)去了,好吧,繼續(xù)循環(huán),又導(dǎo)致 if(template === returnArr[j]) 成立了,結(jié)果 i-- 了,又導(dǎo)致外層循環(huán)繼續(xù)。悲劇。

2017年6月1日 19:05
編輯回答
有你在
let fn = (n, k) =>
     [...Array(n).keys()]
     .map((v, i) => ({num: i, hash: Math.random()}))
     .sort((a, b) => a.hash - b.hash)
     .map(a => a.num)
     .slice(0, k)
2017年5月14日 05:49
編輯回答
晚風(fēng)眠
    function setArr (n, k) {
        if (n+1 < k) return null;
        var mp = new Array(k).fill('init'),
            getrandom = function() {
                var v = Math.floor(Math.random()*(n+1));
                return mp.includes(v) ? getrandom(mp) : v;
            };
        mp.forEach((v, i) => {mp[i] = getrandom();});
        
        return mp;
    }
2018年1月12日 21:40
編輯回答
挽青絲
for(let j = 0; j < returnArr.length; j ++) {
    if(template === returnArr[j]) {
      i --
      break
    }
    else { returnArr.push(template) }
  }
}

這兒邏輯不對(duì)。
你的邏輯是,隨機(jī)數(shù)與已有的逐項(xiàng)比:

  1. 有了則跳出,并i--
  2. 跟[0]不一樣,隨機(jī)數(shù)push,跟[1]不一樣隨機(jī)數(shù)push...這兒錯(cuò)了應(yīng)該是跟所有的都比完了再push。

檢測是否存在應(yīng)indexOf就行了
還有你這個(gè)隨機(jī)數(shù)的范圍是(0,n],感覺你要的可能是[0,n]

2017年6月23日 23:46
編輯回答
清夢
function getArr(n, k) {
    let _set = new Set();
    while (k > 0) {
        if (_set.size < k) {
            let _num = Math.ceil(Math.random() * n);
            _set.add(_num);
        } else {
            break;
        }
    }
    return _set;
}
2017年12月8日 14:27