我们目前的世界仍是基于 P ≠ NP,所以有理由相信:只要我们把牌洗的足够乱,幸运女神或许就会降临。(生活就像英雄联盟,运气游戏而已~)
本篇带来的就是:如何把牌洗的足够乱的 洗牌算法 !
从青铜到王者,面试和实战都用得到! 点赞收藏 ✨
闲言少叙,直接奥力给!!
青铜洗牌 🤬
题目:给你一副崭新的扑克牌(54 张),你如何 “洗乱” 它??
咱青铜玩家通常很暴躁!
不就是洗牌嘛!聪明的青铜玩家,先将问题抽象为算法模型!
问题转化为:
已知:一个数组 nums = [1,2,3,4,5,...,51,52,53,54],求解:一个乱序的新数组 radomNums。(简直不能再 nice 了)
然后采用 【暴力抽取】
在 1 至 54 之前随机生成一个整数,然后把它放到新数组里,然后再随机生成一个整数,如果和之前生成的没重复,直接放入新数组,如果和之前重复了,那再随机生成一个......
这样直至数组中所有数字都被抽取放到新数组,最终得解!
代码实现:
// 生成 nums:
let nums=[]
for(let i=1;i<=54;i++){
nums.push(i)
}
// 青铜洗牌算法:
let count = 0
const shuffle = function(nums) {
let radomNums = []
while (radomNums.length < nums.length) {
count++; // count 计数洗牌次数
let rand = randOne()
if(radomNums.includes(rand)){ // 随机数重复
rand = randOne() // 再次生成
}else{
radomNums.push(rand)
}
}
return radomNums
}
// 在 1 至 54 之间任意取一整数;
const randOne= function() {
return Math.floor(Math.random() * 54) + 1;
}
console.log(shuffle(nums))
console.log(count)
// (54) [22, 48, 13, 23, 15, 12, 18, 50, 5, 28, 27, 52, 46, 16, 40, 6, 33, 9, 41, 30, 54, 14, 36, 53, 17, 2, 11, 37, 42, 3, 8, 21, 25, 20, 34, 32, 35, 4, 43, 26, 38, 24, 10, 45, 31, 49, 44, 19, 51, 7, 1, 39, 47, 29]
// 271
复制代码
完美~ 青铜玩家暴力洗牌,简单直白,在万军丛中直取敌将首级!!
白银洗牌 📍
白银玩家看了青铜玩家的操作,不禁放声大笑!
“痴线~”(sb)
把上述代码拷贝至控制台运行发现,基本上打乱这副扑克牌要洗 200 ~ 300 次!因为越往后,生成随机数重复的概率就越大!
只有痴线才会洗这么多次吧~
于是,白银玩家开始操作起来!遥感
关键词:【交换位置】。
将牌随机分成两堆,让它们交换,然后再随机分成两堆,再让它们交换,然后再随机分出两堆......这样重复洗十几、二十次后,完成洗牌。
实际上,在现实中,我们玩牌,大部分玩家也是这样去洗的,它也叫【印度洗牌法】(难道是阿三发明的?