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

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

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

亂序的意思想必沒(méi)有不知道:就是將數(shù)組打亂。聽(tīng)到亂序一般都會(huì)想到j(luò)s的隨機(jī)函數(shù)Math.random();

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

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

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)

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

運(yùn)行幾次得到的結(jié)果為:

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

Chrome的sort

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

FireFox的sort

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

Safari的sort

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

Microsoft Edge/IE9+

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

以下用chrome測(cè)試亂序各種結(jié)果的概率:

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;
}

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

結(jié)果如下

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

Fisher-Yates算法【也叫“洗牌算法”】:為什么叫 Fisher–Yates 呢? 因?yàn)檫@個(gè)算法是由 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ù)組元素,然后將當(dāng)前元素與以后隨機(jī)位置的元素進(jìn)行交換,這樣亂序更加徹底。

如果用ES6的寫(xiě)法還能精簡(jiǎn)成:

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測(cè)試一下:

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;
}

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

console.log(res)

得到結(jié)果如下:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript實(shí)現(xiàn)信用卡校驗(yàn)方法

    JavaScript實(shí)現(xiàn)信用卡校驗(yàn)方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)信用卡校驗(yàn)方法,涉及javascript使用Luhn算法進(jìn)行校驗(yàn)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • js如何找出字符串中的最長(zhǎng)回文串

    js如何找出字符串中的最長(zhǎng)回文串

    這篇文章主要為大家詳細(xì)介紹了js如何找出字符串中的最長(zhǎng)回文串的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • ES6學(xué)習(xí)筆記之正則表達(dá)式和字符串正則方法分析

    ES6學(xué)習(xí)筆記之正則表達(dá)式和字符串正則方法分析

    這篇文章主要介紹了ES6學(xué)習(xí)筆記之正則表達(dá)式和字符串正則方法,結(jié)合實(shí)例形式對(duì)比分析了ES5與ES6正則操作的常用函數(shù)功能與用法區(qū)別,需要的朋友可以參考下
    2017-04-04
  • js彈出確認(rèn)是否刪除對(duì)話框

    js彈出確認(rèn)是否刪除對(duì)話框

    這篇文章主要介紹了js彈出確認(rèn)是否刪除對(duì)話框,具體實(shí)現(xiàn)代碼如下,需要的朋友可以參考下
    2014-03-03
  • 詳解javascript replace高級(jí)用法

    詳解javascript replace高級(jí)用法

    這篇文章主要介紹了詳解javascript replace高級(jí)用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • JavaScript 異步調(diào)用框架 (Part 2 - 用例設(shè)計(jì))

    JavaScript 異步調(diào)用框架 (Part 2 - 用例設(shè)計(jì))

    在上一篇文章里說(shuō)到,我們要設(shè)計(jì)一個(gè)異步調(diào)用框架,最好能夠統(tǒng)一同步異步調(diào)用的接口,同時(shí)具體調(diào)用順序與實(shí)現(xiàn)方式無(wú)關(guān)。那么我們現(xiàn)在就來(lái)設(shè)計(jì)這樣一個(gè)框架的用例。
    2009-08-08
  • Bootstrap框架實(shí)現(xiàn)廣告輪播效果

    Bootstrap框架實(shí)現(xiàn)廣告輪播效果

    這篇文章主要為大家詳細(xì)介紹了Bootstrap框架結(jié)合JavaScript實(shí)現(xiàn)廣告輪播特效,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 用Javascript實(shí)現(xiàn)Windows任務(wù)管理器的代碼

    用Javascript實(shí)現(xiàn)Windows任務(wù)管理器的代碼

    在Windows系統(tǒng)上,自從98系統(tǒng)以來(lái)就提供了腳本宿主(Windows Scripting Host 簡(jiǎn)稱WSH)的功能,WSH可以加載并運(yùn)行JS和VBS腳本,并支持調(diào)用系統(tǒng)的COM組件,在COM組件的支持下腳本可以輕松實(shí)現(xiàn)非常強(qiáng)大的功能
    2012-03-03
  • javascript instanceof 內(nèi)部機(jī)制探析

    javascript instanceof 內(nèi)部機(jī)制探析

    在 JavaScript 中,可以用 instanceof 來(lái)判斷一個(gè)對(duì)象是不是某個(gè)類或其子類的實(shí)例。
    2010-10-10
  • JS如何把字符串轉(zhuǎn)換成json

    JS如何把字符串轉(zhuǎn)換成json

    這篇文章主要介紹了JS如何把字符串轉(zhuǎn)換成json,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論