我有一个游戏列表,我需要随机选择,到星期几, 以下代码适用于1个游戏。
var gameOfTheDay = games.AllActive[(int)(DateTime.Today.GetHashCode()) % games.AllActive.Count()];
我需要的是返回超过1个游戏,随机化,基于X(上面的例子中的X是星期几,我会将其更改为特定的字符串)
我需要这个来创建一个半随机生成的项目。
半 - 因为我想给它一个关键字,并获得相同的结果Per keyword
随机 - 因为我需要随机制作游戏列表
例如,每当您输入标题为“hello”的Page时,您将看到相同的游戏,这些游戏是根据关键字“hello”从游戏列表中专门为该关键字选择的。
以同样的方式游戏TheDay Works。
答案 0 :(得分:1)
使用与现有相似的代码将游戏随机添加到游戏列表中(最初为空) - 如果游戏已经在列表中,请不要添加。
当列表大小合适时停止。
未经测试的代码:
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);
}
}
答案 1 :(得分: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和关键字的哈希值,以获得该日期关键字组合的唯一随机序列。