如何创建随机值的枚举?(How do you create an enumeration of ra

2019-10-29 15:03发布

我怎样才能得到一个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>实例,它getEnumeratorIEnumerable<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?