码迷,mamicode.com
首页 > 其他好文 > 详细

洗牌算法(转载)

时间:2014-05-26 22:14:15      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:style   c   blog   http   a   int   

 

作者: flyinghearts 
出处: http://www.cnblogs.com/flyinghearts/ 

 

又一次看到讨论“洗牌”算法的文章,奇怪不少人喜欢造轮子,但造的轮子却远没有STL的random_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)]);

 

洗牌算法(转载),布布扣,bubuko.com

洗牌算法(转载)

标签:style   c   blog   http   a   int   

原文地址:http://www.cnblogs.com/gufeiyang/p/3745338.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!