जवाबों:
Random
कहीं कक्षा का उदाहरण बनाएँ । ध्यान दें कि हर बार आपको एक यादृच्छिक संख्या की आवश्यकता होने पर एक नया उदाहरण नहीं बनाना बहुत महत्वपूर्ण है। आपको जनरेट की गई संख्या में एकरूपता प्राप्त करने के लिए पुराने उदाहरण का पुनः उपयोग करना चाहिए। आपके पास एक static
क्षेत्र हो सकता है (थ्रेड सुरक्षा मुद्दों के बारे में सावधान रहें):
static Random rnd = new Random();
Random
उदाहरणों से पूछें कि आपको मदों की अधिकतम संख्या के साथ एक यादृच्छिक संख्या देने के लिए ArrayList
:
int r = rnd.Next(list.Count);
स्ट्रिंग प्रदर्शित करें:
MessageBox.Show((string)list[r]);
Next(max)
कॉल में ऊपरी स्थान अनन्य है।
मैं आमतौर पर विस्तार विधियों के इस छोटे संग्रह का उपयोग करता हूं:
public static class EnumerableExtension
{
public static T PickRandom<T>(this IEnumerable<T> source)
{
return source.PickRandom(1).Single();
}
public static IEnumerable<T> PickRandom<T>(this IEnumerable<T> source, int count)
{
return source.Shuffle().Take(count);
}
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
{
return source.OrderBy(x => Guid.NewGuid());
}
}
जोरदार टाइप की गई सूची के लिए, यह आपको लिखने की अनुमति देगा:
var strings = new List<string>();
var randomString = strings.PickRandom();
यदि आपके पास एक ArrayList है, तो आप इसे डाल सकते हैं:
var strings = myArrayList.Cast<string>();
return list[rnd.Next(list.Count)];
Random
इसके बजाय स्थिर अवस्था में एक उदाहरण रखने पर विचार करें ।
तुम कर सकते हो:
list.OrderBy(x => Guid.NewGuid()).FirstOrDefault()
एक Random
उदाहरण बनाएँ :
Random rnd = new Random();
एक यादृच्छिक स्ट्रिंग प्राप्त करें:
string s = arraylist[rnd.Next(arraylist.Count)];
हालाँकि, याद रखें कि यदि आप ऐसा बार-बार करते हैं, तो आपको Random
ऑब्जेक्ट का पुनः उपयोग करना चाहिए । इसे कक्षा में एक स्थिर क्षेत्र के रूप में रखें ताकि यह केवल एक बार इनिशियलाइज़ हो और फिर इसे एक्सेस करें।
या इस तरह सरल विस्तार वर्ग:
public static class CollectionExtension
{
private static Random rng = new Random();
public static T RandomElement<T>(this IList<T> list)
{
return list[rng.Next(list.Count)];
}
public static T RandomElement<T>(this T[] array)
{
return array[rng.Next(array.Length)];
}
}
तो बस कॉल करें:
myList.RandomElement();
सरणियों के लिए भी काम करता है।
मैं कॉल करने से बचूंगा OrderBy()
क्योंकि यह बड़े संग्रह के लिए महंगा हो सकता है। List<T>
इस उद्देश्य के लिए अनुक्रमित संग्रह जैसे या सरणियों का उपयोग करें ।
IList
इसलिए दूसरा ओवरलोड अनावश्यक है।
ArrayList ar = new ArrayList();
ar.Add(1);
ar.Add(5);
ar.Add(25);
ar.Add(37);
ar.Add(6);
ar.Add(11);
ar.Add(35);
Random r = new Random();
int index = r.Next(0,ar.Count-1);
MessageBox.Show(ar[index].ToString());
maxValue
विधि का पैरामीटर Next
सूची में केवल तत्वों का एक नंबर होना चाहिए, ना कि माइनस एक, क्योंकि एक प्रलेखन के अनुसार " maxValue यादृच्छिक संख्या का अनन्य ऊपरी भाग है "।
मैं थोड़ी देर के लिए इस ExtensionMethod का उपयोग कर रहा हूँ:
public static IEnumerable<T> GetRandom<T>(this IEnumerable<T> list, int count)
{
if (count <= 0)
yield break;
var r = new Random();
int limit = (count * 10);
foreach (var item in list.OrderBy(x => r.Next(0, limit)).Take(count))
yield return item;
}
मैं अलग दृष्टिकोण का सुझाव दूंगा, यदि सूची के अंदर वस्तुओं का क्रम निष्कर्षण पर महत्वपूर्ण नहीं है (और प्रत्येक आइटम को केवल एक बार चुना जाना चाहिए), तो इसके बजाय List
आप एक का उपयोग कर सकते हैं ConcurrentBag
जो एक थ्रेड-सुरक्षित, अनियोजित संग्रह है वस्तुओं:
var bag = new ConcurrentBag<string>();
bag.Add("Foo");
bag.Add("Boo");
bag.Add("Zoo");
द इवेंटहैंडलर:
string result;
if (bag.TryTake(out result))
{
MessageBox.Show(result);
}
TryTake
अव्यवस्थित संग्रह से एक "यादृच्छिक" वस्तु को निकालने के लिए प्रयास करेंगे।
मुझे सिर्फ एक के बजाय अधिक आइटम की आवश्यकता थी। तो, मैंने यह लिखा:
public static TList GetSelectedRandom<TList>(this TList list, int count)
where TList : IList, new()
{
var r = new Random();
var rList = new TList();
while (count > 0 && list.Count > 0)
{
var n = r.Next(0, list.Count);
var e = list[n];
rList.Add(e);
list.RemoveAt(n);
count--;
}
return rList;
}
इसके साथ, आप ऐसे तत्व प्राप्त कर सकते हैं जिन्हें आप यादृच्छिक रूप से इस तरह चाहते हैं:
var _allItems = new List<TModel>()
{
// ...
// ...
// ...
}
var randomItemList = _allItems.GetSelectedRandom(10);
JSON फ़ाइल से यादृच्छिक रूप से देश का नाम प्रिंट करना।
नमूना:
public class Country
{
public string Name { get; set; }
public string Code { get; set; }
}
Implementaton:
string filePath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\..\")) + @"Data\Country.json";
string _countryJson = File.ReadAllText(filePath);
var _country = JsonConvert.DeserializeObject<List<Country>>(_countryJson);
int index = random.Next(_country.Count);
Console.WriteLine(_country[index].Name);
क्यों नहीं [2]:
public static T GetRandom<T>(this List<T> list)
{
return list[(int)(DateTime.Now.Ticks%list.Count)];
}