javascript實現(xiàn)數(shù)組內(nèi)值索引隨機化及創(chuàng)建隨機數(shù)組的方法
本文實例講述了javascript實現(xiàn)數(shù)組內(nèi)值索引隨機化及創(chuàng)建隨機數(shù)組的方法。分享給大家供大家參考。具體如下:
今天在QW交流群里看到有同學討論使數(shù)組隨機化的問題,其中給出的算法很不錯,讓我想起了之前自己實現(xiàn)過的不怎么“漂亮”的方法。想想我們有時候在繁忙的寫業(yè)務代碼時只是為了實現(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)會隨機取一個原數(shù)組中的索引,然后判斷該索引是否已被取過,如果沒有則把該索引的值放入新數(shù)組中,如果取過則把自減鍵 i 自增1(目的是重復該次循環(huán)直到取到另一個未取過的索引)。這樣的方法的性能是很看人品的,原因相信看到這種思路的同學都已明白了。
現(xiàn)在給出群里那位同學的算法:
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;
}
這是一個相當巧妙的算法,在每次循環(huán)中取一個隨機的索引后,并把它的值從數(shù)組中刪除,這樣,如果后面依然隨機取到這個索引,這個索引就已經(jīng)不再是上一次取到的值了,而且隨機數(shù)的取值范圍會根據(jù)數(shù)組的長度的減小而減小,這樣就能一次性循環(huán)一定的次數(shù)而得到理想的結(jié)果。
還看到了一個改進版的,是考慮到了對數(shù)組的刪除操作而導致的些許性能問題,運用了JK大的洗牌算法,即把每一次刪除操作改為了位置替換操作(取到的該索引的值和當前自減鍵 i 對應的值進行互換),這樣對整個數(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間的隨機數(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)文章
用headjs來管理和加載js 提高網(wǎng)站加載速度
headjs其實是一整套的工具,本文介紹的是它其中的Javascript Loader功能。需要的朋友可以參考下2016-11-11
微信小程序web-view無法打開該頁面不支持打開的解決方法
小程序現(xiàn)在日漸成熟,功能也越來越強大,我們今天來一起看看小程序跳轉(zhuǎn)的問題,下面這篇文章主要給大家介紹了關(guān)于微信小程序web-view無法打開該頁面不支持打開的解決方法,需要的朋友可以參考下2023-01-01
get post jsonp三種數(shù)據(jù)交互形式實例詳解
本文通過實例給大家詳細介紹了get post jsonp三種數(shù)據(jù)交互形式,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-08-08

