【问题标题】:How can I convert this to return multiple items?如何将其转换为返回多个项目?
【发布时间】:2011-10-04 12:53:26
【问题描述】:

我有一个游戏列表,需要按星期几随机选择, 以下代码适用于 1 场比赛。

   var gameOfTheDay = games.AllActive[(int)(DateTime.Today.GetHashCode()) % games.AllActive.Count()]; 

我需要的是返回超过 1 个游戏,随机的,基于 X(在上面的例子中 X 是星期几,我会将它更改为特定的字符串)

我需要这个来创建一个半随机生成的项目。

半 - 因为我想给它一个关键字,并且每个关键字得到相同的结果

随机 - 因为我需要让游戏列表随机

例如,每次您进入标题为“hello”的页面时,您都会看到相同的游戏,这些游戏是根据关键字“hello”从游戏列表中专门为该关键字选择的。

gameOfTheDay 的工作方式与此相同。

【问题讨论】:

    标签: c# list random


    【解决方案1】:

    您可以为此使用 LINQ:

    int limit = 10;
    string keyword = "foo";
    
    Random rng = new Random(keyword.GetHashCode());
    var gamesOfTheDay = games.OrderBy(x => rng.Next()).Take(limit);
    

    但是,这会对排序产生一些开销。如果与您选择的数量相比,您有很多游戏——排序可能太贵,而且在发生碰撞时继续重试是安全的——手动执行可能会更快:

    HashSet<Game> gamesOfTheDay = new HashSet<Game>();
    
    while(gamesOfTheDay.Count < limit && gamesOfTheDay.Count < games.Length)
    {
        int idx = rng.Next(games.Length);
        gamesOfTheDay.Add(games[idx]);
    }
    

    请注意,在任何一种情况下,Random 都是使用依赖于关键字的种子构造的,因此每次该关键字的顺序都是相同的。您可以类似地组合当前 DateTime 和关键字的哈希值,以获得该日期-关键字组合的唯一随机序列。

    【讨论】:

    • 抱歉,我对随机游戏和排序不感兴趣,我知道自己会这样做。请查看已编辑的问题以获取更多详细信息。
    • 我更新了我的答案,用关键字的哈希为 RNG 播种。这是你想要的吗?
    【解决方案2】:

    使用与现在类似的代码将游戏随机添加到游戏列表(最初将为空) - 如果游戏已经在列表中,请不要添加。

    当列表大小合适时停止。

    未经测试的代码:

    var rand = new Random();
    var randomGames = new List<game>();
    while(randomGames.Count < limit)
    {
       var aGame = games.AllActive[rand.Next(limit)];
       if (!randomGames.Contains(aGame))
       {
          randomGames.Add(aGame);
       }
    }
    

    【讨论】:

    • aGame 对于循环的所有执行都应该是同一个游戏,因为每次索引计算都会返回相同的值。
    • 安东尼你还有什么想法吗?
    • @Dementic,@Anthony - 非常正确。代码修改为使用Random
    • @Dementic,一种行之有效的方法是执行随机播放,然后按顺序选择您需要的任意数量的项目。如果您对此感兴趣,请查看 Fisher Yates 算法。为了实现使用关键字获得相同结果的愿望,您可以考虑将该关键字转换为随机数生成器的适当种子。
    • @Dementic,与随机选择相比,使用 shuffle 的好处是可以消除冲突 [选择相同的项目],尤其是在选择源列表的大部分时(更多您选择的项目,碰撞的机会越大)。另一方面,如果您选择的百分比很小,那么您可能会处理偶尔的碰撞,就像 Oded 在他的回答中所做的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多