最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過js隨機函數(shù)Math.random實現(xiàn)亂序

 更新時間:2020年05月19日 11:10:07   作者:沐浴點陽光  
這篇文章主要介紹了通過js隨機函數(shù)Math.random實現(xiàn)亂序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

亂序的意思想必沒有不知道:就是將數(shù)組打亂。聽到亂序一般都會想到js的隨機函數(shù)Math.random();

var values = [1, 2, 3, 4, 5];
values.sort(function() {
  return Math.random() - 0.5;
});
console.log(values)

利用數(shù)組的sort方法,判斷隨機出來的0~1值與0.5的大小,實現(xiàn)排序??此埔粋€很不錯的方案,代碼邏輯也沒毛病,一般情況下也確實能夠做到亂序。但是,這是一個偽排序,是的還有但是(我也是今天才知道的,不求甚解的毛病啊~),為什么呢?先看看這個亂序的結果吧:

var times = [0, 0, 0, 0, 0];
for (var i = 0; i < 100000; i++) {
  let arr = [1, 2, 3, 4, 5];
  arr.sort(() => Math.random() - 0.5);
  times[arr[4] - 1]++;
};
console.log(times)

測試的原理是:將[1, 2, 3, 4, 5]亂序10萬次,計算亂序后數(shù)組的最后一個元素是1,2,3,4,5的次數(shù)分別是多少。

運行幾次得到的結果為:

由這幾次運行得到的結果可以看出:2出現(xiàn)的最后的次數(shù)明顯少于其他數(shù)字,不是隨機嗎?按理說概率應該是相差不多才對啊!
其實問題是在sort方法,各個瀏覽器對sort的實現(xiàn)方式不一樣。

Chrome的sort

基于V8引擎,它的排序算進行了很多的優(yōu)化,但是核心是小于等于10的數(shù)組用插入排序(穩(wěn)定),大于10的采用了quickSort(不穩(wěn)定)

FireFox的sort

基于SpiderMonkey引擎,采用了歸并排序(穩(wěn)定)

Safari的sort

基于Nitro(JavaScriptCore )引擎,如果沒有自定義的排序規(guī)則傳入,采用桶排序(不一定穩(wěn)定, 桶排序的穩(wěn)定性取決于桶內(nèi)排序的穩(wěn)定性, 因此其穩(wěn)定性不確定。),傳入自定義規(guī)則,采用歸并排序(穩(wěn)定)

Microsoft Edge/IE9+

基于Chakra引擎,采用快排(不穩(wěn)定)

以下用chrome測試亂序各種結果的概率:

var times = 100000;
var res = {};
for(var i = 0; i < times; i++){
  var arr = [1, 2, 3];
  arr.sort(() => Match.random() - 0.5);
  var key = JSON.stringify(arr);
  res[key] ? res[key]++ : res[key] = 1;
}

// 為了方便展示,轉換成百分比
for (var key in res) {
  res[key] = res[key] / times * 100 + '%';
}
console.log(res);

結果如下

幾種結果出現(xiàn)的概率相差很大...所以說不是一個真正的亂序。

Fisher-Yates算法【也叫“洗牌算法”】:為什么叫 Fisher–Yates 呢? 因為這個算法是由 Ronald Fisher 和 Frank Yates 首次提出的。代碼如下:

function shuffle(a) {
  var j, x, i;
  for (i = a.length; i; i--) {
    j = Math.floor(Math.random() * i);
    x = a[i-1];
    a[i - 1] = a[j];
    a[j] = x;
  }
  return a;
}

其原理就是:遍歷數(shù)組元素,然后將當前元素與以后隨機位置的元素進行交換,這樣亂序更加徹底。

如果用ES6的寫法還能精簡成:

function shuffle(a) {
  for(let i = a.length; i; i--) {
    let j = Math.floor(Math.random() * i);
    [a[i - 1], a[j]] = [a[j], a[i - 1]];
  }
  return a;
}

再用上面的demo測試一下:

var times = 100000;
var res = {};

for (var i = 0; i < times; i++) {
  var arr = shuffle([1, 2, 3]);

  var key = JSON.stringify(arr);
  res[key] ? res[key]++ : res[key] = 1;
}

// 為了方便展示,轉換成百分比
for (var key in res) {
  res[key] = res[key] / times * 100 + '%'
}

console.log(res)

得到結果如下:

各種結果的概率都基本相同了,所以真正實現(xiàn)了亂序的效果!

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • node.js使用nodemailer發(fā)送郵件實例

    node.js使用nodemailer發(fā)送郵件實例

    這篇文章主要介紹了node.js使用nodemailer發(fā)送郵件的方法,例子中使用的是QQ郵箱,你也可以修改成其它的郵箱如163、gmail等,需要的朋友可以參考下
    2014-03-03
  • JavaScript如何自定義trim方法

    JavaScript如何自定義trim方法

    本文介紹了如何自定義trim方法,trim的作用就是去除字符串前后空格,這個方法在字符串處理方面很有實用價值,需要的朋友可以參考下
    2015-07-07
  • bootstrap 表單驗證使用方法

    bootstrap 表單驗證使用方法

    在web開發(fā)過程中表單驗證是比較常見的需求,友好的錯誤提示能夠用戶帶來極好的用戶體驗效果,今天小編給大家?guī)砣绾问褂胋ootstrap 表單驗證功能,一起看看吧
    2017-01-01
  • JS和JQuery實現(xiàn)雪花飄落效果

    JS和JQuery實現(xiàn)雪花飄落效果

    本文主要給大家講述了如何用JS和JQuery兩種方式實現(xiàn)雪花飄落的動畫效果,有需要的朋友收藏一下吧。
    2017-11-11
  • js表頭排序實現(xiàn)方法

    js表頭排序實現(xiàn)方法

    這篇文章主要介紹了js表頭排序實現(xiàn)方法,涉及數(shù)字、字母、字符串比較及排序等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • 判斷客戶端瀏覽器是否安裝了Flash插件的多種方法

    判斷客戶端瀏覽器是否安裝了Flash插件的多種方法

    各種方法判斷客戶端瀏覽器是否安裝了Flash插件,對于必須要支持flash才能瀏覽的頁面來說,提前做下說明,用戶體驗會更好。
    2010-08-08
  • JavaScript中16進制顏色與rgb顏色互相轉換的示例代碼

    JavaScript中16進制顏色與rgb顏色互相轉換的示例代碼

    這篇文章主要介紹了JavaScript中16進制顏色與rgb顏色互相轉換的示例代碼,通過示例代碼介紹了JS 顏色16進制、rgba相互轉換問題,感興趣的朋友一起看看吧
    2024-01-01
  • js實現(xiàn)點擊切換和自動播放的輪播圖

    js實現(xiàn)點擊切換和自動播放的輪播圖

    這篇文章主要為大家詳細介紹了js實現(xiàn)點擊切換和自動播放的輪播圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 點擊按鈕或鏈接不跳轉只刷新頁面的腳本整理

    點擊按鈕或鏈接不跳轉只刷新頁面的腳本整理

    點擊按鈕或鏈接時不跳轉只刷新頁面,在某些情況下還是比較實用的,下面整理些不錯的示例,感興趣的朋友可以參考下
    2013-10-10
  • 原生JavaScript實現(xiàn)瀑布流布局

    原生JavaScript實現(xiàn)瀑布流布局

    這篇文章主要介紹了原生JavaScript實現(xiàn)瀑布流布局的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-12-12

最新評論

察雅县| 托里县| 海口市| 淅川县| 平山县| 富宁县| 宜都市| 施甸县| 榆社县| 安远县| 巴塘县| 安多县| 莱芜市| 保康县| 永定县| 旌德县| 吉林省| 宁国市| 寿宁县| 曲阳县| 皮山县| 南溪县| 新乡县| 桐城市| 凌源市| 永清县| 金秀| 巴青县| 巩义市| 松江区| 罗城| 庄浪县| 井研县| 肥东县| 永登县| 西宁市| 常宁市| 历史| 逊克县| 井研县| 专栏|