【问题标题】:Randomizing an Array of restaurants [duplicate]随机化一组餐馆[重复]
【发布时间】:2013-12-20 03:17:02
【问题描述】:

对于我的计算机科学入门课程,我必须制作一个应用程序来选择具有各种功能的餐厅,但我不知道如何随机化数组。 下面是我的代码。

string[] myRestaurants = new string[9];

myRestaurants[0] = "Wendy's";
myRestaurants[1] = "Arby's";
myRestaurants[2] = "Olive Garden";
myRestaurants[3] = "The Pie";
myRestaurants[4] = "The Cheesecake Factory";
myRestaurants[5] = "Beto's";
myRestaurants[6] = "Dillinger's Saloon";
myRestaurants[7] = "Dayz Alpher";
myRestaurants[8] = "Firehouse subs";

var nextArray = myRestaurants.ToList();
Random rng = new Random();  
int n = nextArray.Count;
while (n > 1)
{
    n--;
    int k = rng.Next(n + 1);
    T value = nextArray[k];
    nextArray[k] = nextArray[n];
    nextArray[n] = value;
    //bang
}

【问题讨论】:

  • 你不能只在方法体中声明一个泛型变量,这不是它的工作方式。您可以删除所有不相关的内容吗?

标签: c# arrays random


【解决方案1】:

您可以使用 LINQ 和 OrderBy 方法将其随机化。再加上您的 Random 类:

myRestaurants = myRestaurants
                    .OrderBy(x => myRandom.Next(myRestaurants.Length))
                    .ToArray();

【讨论】:

  • +1。这会很好用,但我的痴迷者想指出Fisher-Yates shuffle 是一种产生“相当”随机列表的有效方法。
  • 当你可以用一行代码做同样的事情时,你为什么还要努力实现一个算法。我非常怀疑餐厅订单是否至关重要,需要一流的随机化。
  • @JeroenVannevel 鉴于它是一个三行就地算法,它尽可能高效地运行并提供更好的分布,为什么不呢?在这种情况下,LINQ 方法可能很好,但值得注意的是,当分布或性能很重要时,正确的方法是。
  • @TheEvilPenguin 如果您有兴趣,我用 Fisher-Yates 机制添加了答案。 :)
【解决方案2】:

下面的例子是随机的。

Random rand=new Random();
string[] RandomArray = myRestaurants.OrderBy(r => rand.Next()).ToArray();

【讨论】:

    【解决方案3】:

    这是一个使用 Fisher-Yates 机制的通用实现:

    public static class Extensions
    {
        public static void Shuffle<T>(this IList<T> list)
        {
            var rnd = new Random();
    
            for (int i = list.Count - 1; i >= 0; i--)
            {
                var r = rnd.Next(i + 1);
                T value = list[r];
                list[r] = list[i];
                list[i] = value;
            }
        }
    }
    

    用法:

    myRestaurants.Shuffle();
    

    示例输出:

    • 馅饼
    • 迪林杰的轿车
    • 贝托的
    • 橄榄园
    • 芝士蛋糕工厂
    • 戴兹阿尔弗
    • 消防站潜艇
    • 阿比的
    • 温迪的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多