电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

通過js隨機函數Math.random實現亂序

瀏覽:104日期:2024-05-08 08:59:39

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

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

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

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萬次,計算亂序后數組的最后一個元素是1,2,3,4,5的次數分別是多少。

運行幾次得到的結果為:

通過js隨機函數Math.random實現亂序通過js隨機函數Math.random實現亂序通過js隨機函數Math.random實現亂序

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

Chrome的sort

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

FireFox的sort

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

Safari的sort

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

Microsoft Edge/IE9+

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

以下用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);

結果如下

通過js隨機函數Math.random實現亂序

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

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

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

如果用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)

得到結果如下:

通過js隨機函數Math.random實現亂序

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 无线遥控更衣吊篮_IC卡更衣吊篮_电动更衣吊篮配件_煤矿更衣吊篮-力得电子 | 论文查重_免费论文查重_知网学术不端论文查重检测系统入口_论文查重软件 | 深圳湾1号房价_深圳湾1号二手房源 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 铝合金电阻-无源谐波滤波器-上海稳达电讯设备厂 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 无锡不干胶标签,卷筒标签,无锡瑞彩包装材料有限公司 | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 钣金加工厂家-钣金加工-佛山钣金厂-月汇好 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 济南律师,济南法律咨询,山东法律顾问-山东沃德律师事务所 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 深圳APP开发公司_软件APP定制开发/外包制作-红匣子科技 | 冰雕-冰雪世界-大型冰雕展制作公司-赛北冰雕官网 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | GAST/BRIWATEC/CINCINNATI/KARL-KLEIN/ZIEHL-ABEGG风机|亚喜科技 | 真空包装机-诸城市坤泰食品机械有限公司 | 逗网红-抖音网红-快手网红-各大平台网红物品导航 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 报警器_家用防盗报警器_烟雾报警器_燃气报警器_防盗报警系统厂家-深圳市刻锐智能科技有限公司 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 |