博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shuffle算法的一种简易实现
阅读量:5962 次
发布时间:2019-06-19

本文共 671 字,大约阅读时间需要 2 分钟。

算法一般也被称为洗牌算法,主要功能是将数组里的元素随机打乱,在扑克游戏及mp3播放器中比较常见。在C++的STL库中有专门的函数random_shuffle,在.net中就需要自己写了。不过这个算法并不复杂,一种常规写法如下:

    static Random rnd = new Random();

    public static IEnumerable<T> Shuffle<T>(IEnumerable<T> source)

    {

        var elements = source.ToArray();

        for (int i = elements.Length - 1; i > 0; i--)

        {

            int swapIndex = rnd.Next(i + 1);

            yield return elements[swapIndex];

            elements[swapIndex] = elements[i];

        }

 

        yield return elements[0];

    }

 

今天用google的时候发现了另一种写法:。

不过原文里面的写法还稍微麻烦了点,简化一下其实就一句话,使用的时候甚至都不用单独作为函数。

    static IEnumerable<T> Shuffle<T>(IEnumerable<T> source)

    {

        return source.OrderBy(_ => rnd.Next());

    }

 

当然,后面这种算法的效率上要差一点,但用到shuffle算法的时候一般是不会用到大数组的,性能差异几乎可以忽略不计。这种不拘一格的思路确实值得学习一下。

 

转载地址:http://snjax.baihongyu.com/

你可能感兴趣的文章
2017-2018-2 20155224『网络对抗技术』Exp7:网络欺诈防范
查看>>
tomcat 搭建
查看>>
CSS:ie6下漂移布局所遇到的问题
查看>>
Source Code Review
查看>>
分享一下我安装启动Jmeter出错时的解决办法
查看>>
java 调用process
查看>>
用a标签实现submit提交按钮的效果
查看>>
第十周
查看>>
毕向东_Java基础视频教程第20天_IO流(1~4)
查看>>
ES5之defineProperty
查看>>
几图理解BeautifulSoup
查看>>
HashMap内部是如何实现的(转)
查看>>
交互设计[3]--点石成金
查看>>
java实现双向循环链表
查看>>
引用WebService出现错误
查看>>
hdu1542 Atlantis 线段树--扫描线求面积并
查看>>
如何使用缓存提高程序性能
查看>>
几种垃圾回收算法
查看>>
【SRX】折腾了半天终于我的那对SRX210 升级到了 12.1R1.9
查看>>
Python开发【项目】:RPC异步执行命令(RabbitMQ双向通信)
查看>>