实现洗牌算法

作者: Pandakingli | 来源:发表于2017-12-08 16:40 被阅读97次

洗牌算法

Fisher–Yates随机置乱算法也被称做高纳德置乱算法,通俗说就是生成一个有限集合的随机排列。
Fisher-Yates随机置乱算法是无偏的,所以每个排列都是等可能的,当前使用的Fisher-Yates随机置乱算法是相当有效的,需要的时间正比于要随机置乱的数,不需要额为的存储空间开销。

算法流程:

需要随机置乱的n个元素的数组array:
for( i =n-1;i>=1;i--)
(0 =< j <= i)
交换array[i]和array[j]
end

步骤:

各列含义:范围、当前数组随机交换的位置、剩余没有被选择的数、已经随机排列的数


洗牌步骤1.jpeg

第一轮:从1到8中随机选择一个数,得到6,则交换当前数组中第8和第6个数


洗牌步骤2.jpeg
第二轮:从1到7中随机选择一个数,得到2,则交换当前数组中第7和第2个数
洗牌步骤3.jpeg

下一个随机数从1到6中摇出,刚好是6,这意味着只需把当前线性表中的第6个数留在原位置,接着进行下一步;以此类推,直到整个排列完成。


洗牌步骤4.jpeg
截至目前,所有需要的置乱已经完成,所以最终的结果是:7 5 4 3 1 8 2 6

代码

        int[] arr = new int[10];  
        int i;  

        //初始的有序数组  
        for (i = 0; i < 10; i++) 
       {  
            arr[i] = i + 1;  
        }  

        //费雪耶兹置乱算法  
       //每次生成的随机交换位置:
        for (i = arr.length - 1; i > 0; i--)
 {  
            //随机数生成器,范围[0, i]  
            int rand = (new Random()).nextInt(i+1);  

            int temp = arr[i];  
            arr[i] = arr[rand];  
            arr[rand] = temp;  
        }  

参考文章:

1.参考Fisher–Yates shuffle wiki

2.由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle

相关文章

  • 实现洗牌算法

    洗牌算法 Fisher–Yates随机置乱算法也被称做高纳德置乱算法,通俗说就是生成一个有限集合的随机排列。Fis...

  • 洗牌算法

    音乐软件中的随机播放算法是怎样实现的? 洗牌算法(Shuffle) 生成一个随机数(Random) 这里给出洗牌算...

  • Golang洗牌算法,抢红包算法

    本文为转载,原文:Golang洗牌算法,抢红包算法 1. 洗牌算法 洗牌算法,即将原来的顺序打乱,组成新的随机排序...

  • golang洗牌算法实现

    额,其实是个很简单的代码,只不过刚了解到,还是记录一下吧需要导入的包有两个,"math/rand"实现了洗牌算法的...

  • poker 洗牌算法

    扑克游戏中一种洗牌算法的实现:int count = 54;NSMutableArray pokeArray = ...

  • ABitchain项目周报 2018年02月12日

    核心开发工作: 1.主链开发: 1.1共识: 确立DPOS详细实现细节—100% 开发DPOS投票机制、洗牌算法、...

  • 洗牌算法

    一次偶然的机会,需要我生成一个长度为len的数组。数组的内容是[0-len)。这并不难,分分钟生成这样一个数组: ...

  • 洗牌算法

    在工作中需要重写一个洗牌算法,根据网络中的资料分析了一下,已经有总结得很好的了,就直接总结转载了一下。 洗牌算法大...

  • 洗牌算法

    洗牌算法是一个比较形象的术语,本质上让一个数组内的元素随机排列。

  • 洗牌算法

    问题 实现一个最简单的洗牌算法。 分析 很多人第一次都可能会很迷惑,其实只要理解好了这个题目,实现起来相信并不难。...

网友评论

    本文标题:实现洗牌算法

    本文链接:https://www.haomeiwen.com/subject/yimeixtx.html