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)
為撒呢?
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好
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))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
}不知道題主還在跟蹤這個(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);
}
}都在秀解發(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ù)。悲劇。
for(let j = 0; j < returnArr.length; j ++) {
if(template === returnArr[j]) {
i --
break
}
else { returnArr.push(template) }
}
}
這兒邏輯不對(duì)。
你的邏輯是,隨機(jī)數(shù)與已有的逐項(xiàng)比:
檢測是否存在應(yīng)indexOf就行了
還有你這個(gè)隨機(jī)數(shù)的范圍是(0,n],感覺你要的可能是[0,n]
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。