为了账号安全,请及时绑定邮箱和手机立即绑定

随机产生0到n之间的k个不相等整数

随机产生0到n之间的k个不相等整数

烙印99 2019-02-19 17:12:40
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)为撒呢?
查看完整描述

2 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

1, 产生0~n的数组range(n)。

2, 产生同长度的随机数。

3, 用产生的随机数作为key去排序range(n)

4, 取出前k个。其实想从哪个位置取都可以。


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好


查看完整回答
反对 回复 2019-02-20
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

都在秀解发,我来说下题主代码为啥会 死循环 + 爆内存

因为你在数组for循环里又push东西到数组里了啊,这个动作很危险,弄不好就死循环了。不巧你这个代码就撞上了。。。

加断点单步调试一下你就会发现,题主的循环跳不出去啊,因为本来循环要结束了,又push一个元素进去了,好吧,继续循环,又导致 if(template === returnArr[j]) 成立了,结果 i-- 了,又导致外层循环继续。悲剧。


查看完整回答
反对 回复 2019-02-20
  • 2 回答
  • 0 关注
  • 525 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信