我怎样才能得到一个IEnumerable
随机值? 我很失望类随机没有实现IEnumerable<int>
。
Answer 1:
写一个扩展方法 ,这将yield return
的新值。
public static IEnumerable<int> GetRandomValues(this Random instance)
{
while(true)
{
yield return instance.Next();
}
}
Answer 2:
你可以很容易自己实现,例如
public IEnumerable<int> RandomInts(int below)
{
Random r = new Random();
while (true) yield return r.Next(below);
}
Answer 3:
关具有的一些问题点IEnumerable<int>
用于随机类实例是
- 随机发生器有无穷多的元素,所以使用
foreach
构建体或以上的元素不会终止的循环。 - 该
IEnumerator<int>
实例,它getEnumerator
从IEnumerable<int>
应该返回有一个功能Reset
其复位枚举器开始进行采集的。 假设正确的行为,应返回最初产生的随机数,因为它是在过去产生的。
最后一个问题可以以至少两种方式来解决,
- 保持已经产生的值的列表,这可能不是非常高效存储,但至少保证了它总是复位后返回相同的数值。
- 保持所述启动种子,当
Reset
被称为新的发电机可与以前的种子被实例化。 随机的所有其他随机生成方法应该被隐藏,以防止,被访问。
由于簿记方法不是很好,我会去的第二个版本。 这是一个相当大的类,你可以看到下面。
public class RandomInt : IEnumerable<int>
{
int seed;
public RandomInt ()
{
seed = new Random ().Next();
}
public IEnumerator<int> GetEnumerator ()
{
return new InternalEnumerator (seed);
}
protected class InternalEnumerator : IEnumerator<int>
{
Random randomGen;
int current;
int seed;
protected InternalEnumerator (int seed)
{
this.seed = seed;
}
#region IEnumerator implementation
public bool MoveNext ()
{
if (randomGen == null)
randomGen = new Random (seed);
current = randomGen.Next();
return true;
}
public void Reset ()
{
randomGen = null;
}
public int Current {
get {
if (randomGen == null)
throw new InvalidOperationException ("Enumerator in reset state");
return current;
}
}
#endregion
}
}
文章来源: How do you create an enumeration of random values?