卡牌大师:玩转“洗牌算法”,幸运女神在微笑 (*^_^*)

本文介绍了从青铜到王者级别的洗牌算法,包括暴力抽取、印度洗牌法、Fisher-Yates 洗牌算法、鸽尾式洗牌法以及考虑概率分布的洗牌策略。通过不断深入,揭示了洗牌算法背后的数学原理和随机性讨论,最后探讨了随机数生成的真随机与伪随机之分。
摘要由CSDN通过智能技术生成

我们目前的世界仍是基于 P ≠ NP,所以有理由相信:只要我们把牌洗的足够乱,幸运女神或许就会降临。(生活就像英雄联盟,运气游戏而已~)

102300016s4n007o28on.gif

本篇带来的就是:如何把牌洗的足够乱的 洗牌算法

从青铜到王者,面试和实战都用得到! 点赞收藏 ✨

闲言少叙,直接奥力给!!

青铜洗牌 🤬

题目:给你一副崭新的扑克牌(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 次!因为越往后,生成随机数重复的概率就越大!

只有痴线才会洗这么多次吧~

于是,白银玩家开始操作起来!遥感

关键词:【交换位置】

将牌随机分成两堆,让它们交换,然后再随机分成两堆,再让它们交换,然后再随机分出两堆......这样重复洗十几、二十次后,完成洗牌。

实际上,在现实中,我们玩牌,大部分玩家也是这样去洗的,它也叫【印度洗牌法】(难道是阿三发明的?

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值