欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript實(shí)現(xiàn)數(shù)組內(nèi)值索引隨機(jī)化及創(chuàng)建隨機(jī)數(shù)組的方法

 更新時(shí)間:2015年08月10日 11:48:14   作者:__fon123__  
這篇文章主要介紹了javascript實(shí)現(xiàn)數(shù)組內(nèi)值索引隨機(jī)化及創(chuàng)建隨機(jī)數(shù)組的方法,涉及javascript數(shù)組索引及隨機(jī)數(shù)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(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ì)有所幫助。

相關(guān)文章

最新評(píng)論