javascript實現(xiàn)數(shù)組內(nèi)值索引隨機(jī)化及創(chuàng)建隨機(jī)數(shù)組的方法
本文實例講述了javascript實現(xiàn)數(shù)組內(nèi)值索引隨機(jī)化及創(chuàng)建隨機(jī)數(shù)組的方法。分享給大家供大家參考。具體如下:
今天在QW交流群里看到有同學(xué)討論使數(shù)組隨機(jī)化的問題,其中給出的算法很不錯,讓我想起了之前自己實現(xiàn)過的不怎么“漂亮”的方法。想想我們有時候在繁忙的寫業(yè)務(wù)代碼時只是為了實現(xiàn)其功能,并未花太大心思去思考是否有更好的實現(xiàn)方法。
就這個數(shù)組問題(隨即排序一個數(shù)組里的值,返回一個新數(shù)組)來說,我以前的實現(xiàn)方法是這樣的:
function randArr(arr) {
var ret = [],
obj = {},
i = arr.length,
l = i,
n;
while (--i >= 0) {
n = Math.floor( Math.random() * l );
if (obj[n] === void 0) {
ret[ret.length] = obj[n] = arr[n];
} else {
i++;
}
}
return ret;
}
上面的代碼會工作,但并不是一個好的算法,它打算執(zhí)行“原數(shù)組的長度”次循環(huán),每一次循環(huán)會隨機(jī)取一個原數(shù)組中的索引,然后判斷該索引是否已被取過,如果沒有則把該索引的值放入新數(shù)組中,如果取過則把自減鍵 i 自增1(目的是重復(fù)該次循環(huán)直到取到另一個未取過的索引)。這樣的方法的性能是很看人品的,原因相信看到這種思路的同學(xué)都已明白了。
現(xiàn)在給出群里那位同學(xué)的算法:
function randArr(arr) {
var ret = [],
i = arr.length,
n;
arr = arr.slice(0);
while (--i >= 0) {
n = Math.floor( Math.random() * i);
ret[ret.length] = arr.splice(n, 1)[0];
}
return ret;
}
這是一個相當(dāng)巧妙的算法,在每次循環(huán)中取一個隨機(jī)的索引后,并把它的值從數(shù)組中刪除,這樣,如果后面依然隨機(jī)取到這個索引,這個索引就已經(jīng)不再是上一次取到的值了,而且隨機(jī)數(shù)的取值范圍會根據(jù)數(shù)組的長度的減小而減小,這樣就能一次性循環(huán)一定的次數(shù)而得到理想的結(jié)果。
還看到了一個改進(jìn)版的,是考慮到了對數(shù)組的刪除操作而導(dǎo)致的些許性能問題,運(yùn)用了JK大的洗牌算法,即把每一次刪除操作改為了位置替換操作(取到的該索引的值和當(dāng)前自減鍵 i 對應(yīng)的值進(jìn)行互換),這樣對整個數(shù)組的影響是最小的,還是放代碼吧:
function randArr(arr) {
var ret = [],
i = arr.length,
n;
arr = arr.slice(0);
while (--i >= 0) {
n = Math.floor( Math.random() * i);
ret[ret.length] = arr[n];
arr[n] = arr[i];
}
return ret;
}
最后給出一個“創(chuàng)建值為min~max間的隨機(jī)數(shù)組”的方法,算法原理同上面的差不多:
function makeRandArr(min, max) {
var ret = [],
obj = {},
n;
for (; max >= min; max--) {
n = Math.ceil( Math.random() * (max - min) ) + min;
ret[ret.length] = obj[n] || n;
obj[n] = obj[max] || max;
}
return ret;
}
希望本文所述對大家的javascript程序設(shè)計有所幫助。
- js創(chuàng)建數(shù)組的簡單方法
- js創(chuàng)建一個input數(shù)組并綁定click事件的方法
- javascript數(shù)組操作(創(chuàng)建、元素刪除、數(shù)組的拷貝)
- JavaScript 批量創(chuàng)建數(shù)組的方法
- javascript創(chuàng)建數(shù)組的最簡代碼
- javascript創(chuàng)建數(shù)組之聯(lián)合數(shù)組的使用方法示例
- js二維數(shù)組定義和初始化的三種方法總結(jié)
- JS二維數(shù)組的定義說明
- 關(guān)于js二維數(shù)組和多維數(shù)組的定義聲明(詳解)
- JavaScript動態(tài)創(chuàng)建二維數(shù)組的方法示例
相關(guān)文章
基于BootStrap Metronic開發(fā)框架經(jīng)驗小結(jié)【五】Bootstrap File Input文件上傳插件的用法
本文主要基于我自己的框架代碼案例,介紹其中文件上傳插件File Input的使用,非常具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
一個XML格式數(shù)據(jù)轉(zhuǎn)換為圖表的例子
這個例子使用的是轉(zhuǎn)換為VML的語法,換成其他如SVG的語法,就可以轉(zhuǎn)換成為SVG圖形,單元數(shù)量可以任意加。2010-02-02
html5+canvas實現(xiàn)支持觸屏的簽名插件教程
jq-signature.js是一個幫助你創(chuàng)建簽名的jQuery插件,允許你的用戶使用鼠標(biāo),手指或者鉛筆生成簽名。下面這篇文章主要給大家介紹了利用html5+canvas實現(xiàn)支持觸屏的簽名插件的相關(guān)資料,需要的朋友可以參考下。2017-05-05
微信小程序調(diào)用wx.getImageInfo遇到的坑解決
這篇文章主要介紹了微信小程序調(diào)用wx.getImageInfo遇到的坑解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

