javascript實(shí)現(xiàn)數(shù)組內(nèi)值索引隨機(jī)化及創(chuàng)建隨機(jī)數(shù)組的方法
本文實(shí)例講述了javascript實(shí)現(xiàn)數(shù)組內(nèi)值索引隨機(jī)化及創(chuàng)建隨機(jī)數(shù)組的方法。分享給大家供大家參考。具體如下:
今天在QW交流群里看到有同學(xué)討論使數(shù)組隨機(jī)化的問(wèn)題,其中給出的算法很不錯(cuò),讓我想起了之前自己實(shí)現(xiàn)過(guò)的不怎么“漂亮”的方法。想想我們有時(shí)候在繁忙的寫(xiě)業(yè)務(wù)代碼時(shí)只是為了實(shí)現(xiàn)其功能,并未花太大心思去思考是否有更好的實(shí)現(xiàn)方法。
就這個(gè)數(shù)組問(wèn)題(隨即排序一個(gè)數(shù)組里的值,返回一個(gè)新數(shù)組)來(lái)說(shuō),我以前的實(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; }
上面的代碼會(huì)工作,但并不是一個(gè)好的算法,它打算執(zhí)行“原數(shù)組的長(zhǎng)度”次循環(huán),每一次循環(huán)會(huì)隨機(jī)取一個(gè)原數(shù)組中的索引,然后判斷該索引是否已被取過(guò),如果沒(méi)有則把該索引的值放入新數(shù)組中,如果取過(guò)則把自減鍵 i 自增1(目的是重復(fù)該次循環(huán)直到取到另一個(gè)未取過(guò)的索引)。這樣的方法的性能是很看人品的,原因相信看到這種思路的同學(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; }
這是一個(gè)相當(dāng)巧妙的算法,在每次循環(huán)中取一個(gè)隨機(jī)的索引后,并把它的值從數(shù)組中刪除,這樣,如果后面依然隨機(jī)取到這個(gè)索引,這個(gè)索引就已經(jīng)不再是上一次取到的值了,而且隨機(jī)數(shù)的取值范圍會(huì)根據(jù)數(shù)組的長(zhǎng)度的減小而減小,這樣就能一次性循環(huán)一定的次數(shù)而得到理想的結(jié)果。
還看到了一個(gè)改進(jìn)版的,是考慮到了對(duì)數(shù)組的刪除操作而導(dǎo)致的些許性能問(wèn)題,運(yùn)用了JK大的洗牌算法,即把每一次刪除操作改為了位置替換操作(取到的該索引的值和當(dāng)前自減鍵 i 對(duì)應(yīng)的值進(jìn)行互換),這樣對(duì)整個(gè)數(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; }
最后給出一個(gè)“創(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; }
希望本文所述對(duì)大家的javascript程序設(shè)計(jì)有所幫助。
- js創(chuàng)建數(shù)組的簡(jiǎn)單方法
- js創(chuàng)建一個(gè)input數(shù)組并綁定click事件的方法
- javascript數(shù)組操作(創(chuàng)建、元素刪除、數(shù)組的拷貝)
- JavaScript 批量創(chuàng)建數(shù)組的方法
- javascript創(chuàng)建數(shù)組的最簡(jiǎn)代碼
- javascript創(chuàng)建數(shù)組之聯(lián)合數(shù)組的使用方法示例
- js二維數(shù)組定義和初始化的三種方法總結(jié)
- JS二維數(shù)組的定義說(shuō)明
- 關(guān)于js二維數(shù)組和多維數(shù)組的定義聲明(詳解)
- JavaScript動(dòng)態(tài)創(chuàng)建二維數(shù)組的方法示例
相關(guān)文章
用headjs來(lái)管理和加載js 提高網(wǎng)站加載速度
headjs其實(shí)是一整套的工具,本文介紹的是它其中的Javascript Loader功能。需要的朋友可以參考下2016-11-11微信小程序web-view無(wú)法打開(kāi)該頁(yè)面不支持打開(kāi)的解決方法
小程序現(xiàn)在日漸成熟,功能也越來(lái)越強(qiáng)大,我們今天來(lái)一起看看小程序跳轉(zhuǎn)的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于微信小程序web-view無(wú)法打開(kāi)該頁(yè)面不支持打開(kāi)的解決方法,需要的朋友可以參考下2023-01-01get post jsonp三種數(shù)據(jù)交互形式實(shí)例詳解
本文通過(guò)實(shí)例給大家詳細(xì)介紹了get post jsonp三種數(shù)據(jù)交互形式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-08-08