如何创建随机值的枚举?

时间:2012-07-11 14:47:32

标签: c# .net random ienumerable

如何获得IEnumerable个随机值?我很失望课程Random没有实现IEnumerable<int>

3 个答案:

答案 0 :(得分:8)

编写扩展方法yield return新值。

public static IEnumerable<int> GetRandomValues(this Random instance)
{
    while(true)
    {
        yield return instance.Next();
    }
}

答案 1 :(得分:3)

您可以相当轻松地自行实现,例如

public IEnumerable<int> RandomInts(int below)
{
    Random r = new Random();
    while (true) yield return r.Next(below);
}

答案 2 :(得分:1)

为Random类设置IEnumerable<int>实例的一些问题点是

  • 随机生成器具有无限多个元素,因此使用foreach构造或元素上的循环将永远不会终止。
  • 来自IEnumerator<int>的{​​{1}}应返回的getEnumerator实例具有函数IEnumerable<int>,该函数将枚举数重置为集合的开头。假设行为正确,则应返回第一个生成的随机数,就像过去生成的一样。

最后一个问题至少可以通过两种方式解决,

  • 保留已生成值的列表,这可能不是非常有效的内存,但至少可以确保它在重置后始终返回相同的值。
  • 保持起始种子并且在调用Reset时,可以使用前一种子实例化新生成器。应隐藏Random的所有其他随机生成方法,以防止被访问。

由于簿记方法不是很好,我会选择第二个版本。这是一个相当大的课程,如下所示。

Reset