উত্তর:
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());
}
}
দৃ strongly়ভাবে টাইপ করা তালিকার জন্য, এটি আপনাকে লেখার অনুমতি দেবে:
var strings = new List<string>();
var randomString = strings.PickRandom();
আপনার সমস্ত কিছু যদি অ্যারেলিস্ট হয় তবে আপনি এটি কাস্ট করতে পারেন:
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
কেবল কয়েকটি সংখ্যক উপাদান হওয়া উচিত, বিয়োগ একটি নয়, কারণ একটি ডকুমেন্টেশন অনুসারে " ম্যাক্সভ্যালু এলোমেলো সংখ্যার একচেটিয়া উপরের সীমানা "।
আমি এই এক্সটেনশনমেডটিকে কিছুক্ষণ ব্যবহার করছি:
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
Unordered সংগ্রহ থেকে একটি "র্যান্ডম" বস্তু বের করার চেষ্টা করবে।
আমার কেবল একটির পরিবর্তে আরও আইটেম দরকার ছিল। সুতরাং, আমি এটি লিখেছি:
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)];
}