C# LINQ group by并从每个组中选择随机元素
我有一组问题,每个问题都有一个“组”属性 我想从每组抽取一个包含一个随机问题的集合 我尝试了以下LINQ查询:C# LINQ group by并从每个组中选择随机元素,c#,linq,C#,Linq,我有一组问题,每个问题都有一个“组”属性 我想从每组抽取一个包含一个随机问题的集合 我尝试了以下LINQ查询: _questions = _questions.GroupBy(q => q.Group) .Select(g => g.ElementAt(new Random().Next(0, g.Count()))) .ToList(); 但它看起来是随机的。下一个值只计算一次,所以在每个
_questions = _questions.GroupBy(q => q.Group)
.Select(g => g.ElementAt(new Random().Next(0, g.Count())))
.ToList();
但它看起来是随机的。下一个值只计算一次,所以在每个组上使用相同的生成值
这可能就是它的工作原理(或者我遗漏了一些东西),但是如果我想在从每个组中选择一个元素时为每个组生成一个新的随机数,我该怎么做呢
显然,这是可以解决的“困难的方式”,但我可以用LINQ查询吗
这很简单。只需在查询外部定义随机实例:
Random rnd = new Random();
_questions = _questions.GroupBy( q => q.Group )
.Select( g => g.ElementAt(rnd.Next(0, g.Count())) ).ToList();
然后在查询中使用此rnd
:
Random rnd = new Random();
_questions = _questions.GroupBy( q => q.Group )
.Select( g => g.ElementAt(rnd.Next(0, g.Count())) ).ToList();
这很简单。只需在查询之外定义随机实例:
Random rnd = new Random();
_questions = _questions.GroupBy( q => q.Group )
.Select( g => g.ElementAt(rnd.Next(0, g.Count())) ).ToList();
然后在查询中使用此rnd
:
Random rnd = new Random();
_questions = _questions.GroupBy( q => q.Group )
.Select( g => g.ElementAt(rnd.Next(0, g.Count())) ).ToList();
我觉得所选择的答案虽然给出了一个合理的解决方案,但并没有说明手头的问题,所以我给出了这个描述 发生的情况是,您的代码没有只运行一次
Next(…)
,而是多次运行new Random()。Next(…)
。这意味着每一个随机数都来自一个新的实例,这是许多以前的问题(例如(见Guffa的答案))所关注的原因。这似乎总是产生相同的结果,因为
- 新的
实例将在创建时播种随机
- 它们是在一个紧密的循环中创建的,所以这一切都发生得很快
Selman22提供的答案很好地解决了这个问题,因为它只创建了一个
Random
实例,所以它只播了一次种子,当你调用Next(…)
时,会给你你期望的随机数。我觉得选择的答案,虽然给出了一个合理的解决方案,但并没有明确当前的问题,所以我提供了这个描述
发生的情况是,您的代码没有只运行一次Next(…)
,而是多次运行new Random()。Next(…)
。这意味着每一个随机数都来自一个新的实例,这是许多以前的问题(例如(见Guffa的答案))所关注的原因。这似乎总是产生相同的结果,因为
- 新的
实例将在创建时播种随机
- 它们是在一个紧密的循环中创建的,所以这一切都发生得很快
Selman22提供的答案很好地解决了这个问题,因为它只创建了一个
Random
实例,因此它只被播种一次,当您调用Next(…)
时,会给您期望的随机数,这很容易。谢谢:)嘿,那很容易。谢谢:)谢谢你详细说明。我真的很想知道为什么新的随机实例方法不起作用,所以谢谢你的解释。谢谢你详细解释。我想知道为什么新的随机实例方法不起作用,所以谢谢你的解释。