STL库中Random Shuffle的实现,随机洗牌算法

本文探讨了如何使用STL库实现公平的随机洗牌算法,以确保数组中每个元素出现在任意位置的概率相等。介绍了两种解法,包括从特定区间随机选取元素进行交换,以及每个元素与所有元素中的任意一个进行交换。讨论了时间复杂度,并提供了C++源代码示例。
摘要由CSDN通过智能技术生成

中文背景:随机洗牌

给定一个数组,要求打乱数组顺序,并使得每个元素出现在任何地方的概率都相同。

斗地主版:

对于一个斗地主游戏,给出一个发牌的算法,让每个人的牌确保随机。

即假设由n张牌,要分出来m张牌,给k个人,此时n张牌一共有n! 种排列,需要随机产生一种排列,将排列的前m张牌一次分给k个人。需要使用均匀随机排列洗牌算法,使之能保证,对于n张牌的n! 种排列,得到的任意一种排列的概率都是相同的,即都为\frac{1}{n!} 。

验证方法:

  • 该算法能产生的排列个数有n! 种
  • 每种排列产生的概率相同,即都为1/n!

英文背景:Random Shuffle

Given an array, you need to shuffle the order of the arrays so that each element has the same probability of appearing anywhere.

解法1:(来自STL库, 公平洗牌)

在范围为 [1, n] 的数组中,随机选取一个元素(包括第一个元素),将它与第一个元素进行交换,然后在 [2, n] 中随机选取一个元素,将它与第二个元素进行交换,重复以上过程,直到遍历到最后一个元素。伪代码如下:

for

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值