2010-06-28 17 views
125

सी # में मनमाने ढंग से गणना को देखते हुए, मैं एक यादृच्छिक मूल्य कैसे चुनूं?मैं गणना से यादृच्छिक मूल्य कैसे चुनूं?

(मैं इतने पर यह बहुत ही बुनियादी सवाल नहीं मिला। मैं किसी के लिए संदर्भ के रूप में एक मिनट में मेरा उत्तर पोस्ट करेंगे, लेकिन कृपया अपने खुद के जवाब पोस्ट करने के लिए स्वतंत्र लग रहा है।) के लिए

उत्तर

209
Array values = Enum.GetValues(typeof(Bar)); 
Random random = new Random(); 
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length)); 
+28

सुनिश्चित करें कि आप 'एक तंग पाश में random' पुनः हालांकि नहीं रखते बनाने की कोई ज़रूरत नहीं

var rnd = new Random(); return (MyEnum) rnd.Next(Enum.GetNames(typeof(MyEnum)).Length); 

- अन्यथा आप एक ही मूल्य मिल रहा रखेंगे। – ChrisF

+0

क्या यह यादृच्छिक होना चाहिए। अगला (मान। लम्बाई -1)? – uriDium

+3

@uriDium नहीं, तर्क निर्दिष्ट करता है कि कौन सा मान वापस लौटने के लिए बहुत बड़ा होना है (यानी।_max minus 1_) – mafu

47

Enum.GetValues ​​उपयोग सभी मूल्यों की एक सरणी पुनर्प्राप्त करें। फिर एक यादृच्छिक सरणी आइटम का चयन करें।

static T RandomEnumValue<T>() 
{ 
    var v = Enum.GetValues (typeof (T)); 
    return (T) v.GetValue (new Random().Next(v.Length)); 
} 

टेस्ट:

for (int i = 0; i < 10; i++) { 
    var value = RandomEnumValue<System.DayOfWeek>(); 
    Console.WriteLine (value.ToString()); 
} 

->

Tuesday 
Saturday 
Wednesday 
Monday 
Friday 
Saturday 
Saturday 
Saturday 
Friday 
Wednesday 

अपडेट किया गया: इस उत्तर मूल रूप से एक यादृच्छिक तत्व का चयन करने के OrderBy (x => _Random.Next()).FirstOrDefault() इस्तेमाल किया। केवल अगर आप यादृच्छिक रूप से यादृच्छिक कुंजी द्वारा shuffling के लिए आकर्षित कर रहे हैं इसका उपयोग करें। किसी भी अन्य मामले में, इसके बजाय डारिन डिमिट्रोव द्वारा स्वीकृत उत्तर का उपयोग करें, जिसे मैंने बाद में इस जवाब में शामिल किया था।

2

कॉल Enum.GetValues; यह एक सरणी देता है जो आपके enum के लिए सभी संभावित मानों का प्रतिनिधित्व करता है। इस सरणी से एक यादृच्छिक आइटम उठाओ। उस आइटम को मूल enum प्रकार पर वापस कास्ट करें।

2

यहां इसके लिए एक सामान्य कार्य है। उच्च आवृत्ति कोड के बाहर आरएनजी निर्माण रखें।

public static Random RNG = new Random(); 

public static T RandomEnum<T>() 
{ 
    Type type = typeof(T); 
    Array values = Enum.GetValues(type); 
    lock(RNG) 
    { 
     object value= values.GetValue(RNG.Next(values.Length)); 
     return (T)Convert.ChangeType(value, type); 
    } 
} 

प्रयोग उदाहरण:

System.Windows.Forms.Keys randomKey = RandomEnum<System.Windows.Forms.Keys>(); 
+0

एक स्थिर विधि जो थ्रेडसेफ नहीं है वह बहुत खतरनाक है। – CodesInChaos

+0

@CodesInChaos आप सही हैं। Random.Next() थ्रेडसेफ नहीं है और टूटने पर शून्य को वापस करना शुरू कर देगा। मैंने इस जानकारी के आधार पर अपना उत्तर अपडेट कर लिया है। – WHol

0

व्यक्तिगत रूप से, मैं विस्तार तरीकों के एक प्रशंसक हूँ, इसलिए मैं कुछ इस तरह (जबकि वास्तव में एक विस्तार है, यह समान दिखता है) का प्रयोग करेंगे:

public enum Options { 
    Zero, 
    One, 
    Two, 
    Three, 
    Four, 
    Five 
} 

public static class RandomEnum { 
    private static Random _Random = new Random(Environment.TickCount); 

    public static T Of<T>() { 
     if (!typeof(T).IsEnum) 
      throw new InvalidOperationException("Must use Enum type"); 

     Array enumValues = Enum.GetValues(typeof(T)); 
     return (T)enumValues.GetValue(_Random.Next(enumValues.Length)); 
    } 
} 

[TestClass] 
public class RandomTests { 
    [TestMethod] 
    public void TestMethod1() { 
     Options option; 
     for (int i = 0; i < 10; ++i) { 
      option = RandomEnum.Of<Options>(); 
      Console.WriteLine(option); 
     } 
    } 

} 
0

के रूप में LINQ का उपयोग कर वैकल्पिक संस्करण यहां दिया गया है।

using System; 
using System.Linq; 

public static class EnumExtensions 
{ 
    public static Enum GetRandomEnumValue(this Type t) 
    { 
     return Enum.GetValues(t)   // get values from Type provided 
      .OfType<Enum>()    // casts to Enum 
      .OrderBy(e => Guid.NewGuid()) // mess with order of results 
      .FirstOrDefault();   // take first item in result 
    } 
} 

public static class Program 
{ 
    public enum SomeEnum 
    { 
     One = 1, 
     Two = 2, 
     Three = 3, 
     Four = 4 
    } 

    public static void Main() 
    { 
     for(int i=0; i < 10; i++) 
     { 
      Console.WriteLine(typeof(SomeEnum).GetRandomEnumValue()); 
     } 
    }   
} 

दो
एक
चार
चार
चार
तीन
दो
चार
एक
तीन

1

तुम बस ऐसा कर सकता है: सरणियों स्टोर करने के लिए

+0

'GetNames' एक सरणी देता है। –

+0

मेरा मतलब था कि आपको इसे स्टोर करने की आवश्यकता नहीं है। मेरी गलती –

संबंधित मुद्दे