zoukankan      html  css  js  c++  java
  • shuffle算法的一种简易实现

    shuffle算法一般也被称为洗牌算法,主要功能是将数组里的元素随机打乱,在扑克游戏及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的时候发现了另一种写法:http://www.dotnetperls.com/shuffle-array

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

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

        {

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

        }

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

  • 相关阅读:
    C++高精度乘法
    经典的7种排序算法 原理C++实现
    c++ STL
    二分查找c++
    洛谷P1111 修复公路
    01背包写法
    c++编码规范
    github教程
    windows10锁定屏幕聚焦图片导出
    week 6 Spring history and design philosophy
  • 原文地址:https://www.cnblogs.com/TianFang/p/2174177.html
Copyright © 2011-2022 走看看