如何獲得隨機值IEnumerable
?我對班級Random未執行IEnumerable<int>
感到失望。你如何創建一個隨機值的枚舉?
回答
編寫一個擴展方法即將yield return
新值。
public static IEnumerable<int> GetRandomValues(this Random instance)
{
while(true)
{
yield return instance.Next();
}
}
+1喜歡隨機擴展的想法 – 2012-07-11 14:53:15
謝謝。如果我創建了一個'GetEnumerator'擴展方法,我現在能夠在類型爲Random的對象上進行「foreach」操作嗎? – 2012-07-11 15:00:19
+1這是一個比我匆忙編寫的答案更好的API。 – 2012-07-11 15:01:36
你可以很容易自己實現,例如
public IEnumerable<int> RandomInts(int below)
{
Random r = new Random();
while (true) yield return r.Next(below);
}
+1不錯和簡單! – n8wrl 2012-07-11 14:52:18
我會通過隨機的實例來避免播種問題。 – CodesInChaos 2012-07-11 14:55:00
@代碼是的,這是一個好主意......但是,我的答案與Jakub的答案几乎相同:p – Rawling 2012-07-11 15:13:27
的一些問題點過具有Random類的IEnumerable<int>
實例是
- ,隨機數生成有無窮多元素,因此使用
foreach
構造或元素上的循環將永遠不會終止。 IEnumerator<int>
getEnumerator
getEnumerator
IEnumerable<int>
應該返回的函數Reset
將枚舉數重置爲集合的開始。假設正確的行爲,這應該返回第一個生成的隨機數,因爲它是在過去生成的。
最後一個問題可以以至少兩種方式來解決,
- 保持已經產生的值的列表,這可能不是非常高效存儲,但至少保證了它總是會返回重置後的值相同。
- 保留起始種子,並且當
Reset
被稱爲新的生成器時可以用前一個種子實例化。 Random的所有其他隨機生成方法應被隱藏以防止被訪問。
由於簿記方法不是很好,我會去第二個版本。這是一個相當大的階級,你可以看到下面。
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
}
}
- 1. 來自任何枚舉的隨機值
- 2. 如何創建一個隨機bit64值
- 3. 如何爲pageControl.currentPage創建一個枚舉?
- 4. 一旦創建了C枚舉值,你可以添加值嗎?
- 5. 隨機的值從枚舉的概率
- 6. 如何創建一個獲取枚舉類型值的宏?
- 7. 如何用'&'在枚舉中創建一個值
- 8. 斯威夫特:選擇了一個隨機枚舉值
- 9. Java:從枚舉中選擇一個隨機值?
- 10. 如何在Swift中隨機選擇一個枚舉
- 11. 隨機枚舉生成
- 12. 生成隨機枚舉
- 13. 創建一個std :: vector的枚舉
- 14. 如果你有一個字符串和枚舉沒有getSomething(String str)方法,你如何查找枚舉值?
- 15. 如何從枚舉中選擇隨機值?
- 16. 創建一個沒有0值的C#枚舉的實例
- 17. 基於枚舉創建枚舉類別
- 18. 如何選擇下一個枚舉值?
- 19. 創建一個隨機數
- 20. 有沒有辦法創建一個枚舉值的別名?
- 21. 如何爲枚舉的RTTI字段創建一個通用TValue?
- 22. 如何創建一個不斷重試的枚舉器
- 23. 在枚舉中創建枚舉列表,並且不包含值
- 24. 如何將一個枚舉值轉換/分配給另一個枚舉
- 25. 如何創建無法枚舉多個枚舉的IEnumerable <T>?
- 26. 如何創建一個紅寶石枚舉和解析來自querystring的值?
- 27. objective-c如何創建一個枚舉數組作爲鍵的字符串值?
- 28. ngGrid單元格值是一個枚舉值,我該如何使用枚舉名?
- 29. 如何創建一個泛型類來保存枚舉
- 30. 如何創建一個枚舉方法(java)
會隨機產生一組號碼,並將其存儲在一個列表,其中實現IEnumerable,滿足您的要求嗎? –
2012-07-11 14:50:52
而我很失望,它沒有實現'IEnumerable'......哦,現在我明白他們爲什麼沒有實現。 –
user7116
2012-07-11 14:53:40