“洗牌”算法

                            

又一次看到讨论“洗牌”算法的文章,奇怪不少人喜欢造轮子,但造的轮子却远没有STLrandom_shuffle好用。

 

“洗牌”算法:

若某个序列里面的每个元素在每个位置已经等概率出现,那么新增加一个元素,只要新增加的元素和所有元素进行等概率交换,则新序列中每个元素在每个位置仍是等概率出现。

(若原来有n个元素,新增加的第n+1个元素在任一位置b的概率显然是1/(n+1),在同一位置b,原来的n个元素在该位置仍是等概率出现的,出现的概率为(1-1/(n+1))/n = 1/(n+1)

也可以这样算:进行随机交换前,原来的某个元素在某个位置出现的概率为1/n,被交换的概率为1/(n+1),因而该元素在该位置出现的概率调整为:1/n * (1-1/(n+1)) = 1/(n+1),在新增位置出现的概率为:1/n * 1/(n+1) * n = 1/(n+1) (有n个位置,乘以n)。)

 

(只有一个元素时,显然已经满足等概率条件,因而从第二个元素开始)

for (int i = 1; i < len; ++i) swap(arr[i], arr[rand(0, i + 1)]);

 

 

转载于:https://www.cnblogs.com/flyinghearts/archive/2011/03/22/1992000.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值