প্রতিবার আপনি new Random()
এটি ঘড়ি ব্যবহার করে আরম্ভ করা হয়। এর অর্থ একটি শক্ত লুপে আপনি একই মানটি অনেক বার পান lots আপনি একটি একক রাখা উচিত এলোমেলো উদাহরণস্বরূপ এবং ব্যবহার করা চালিয়ে পরবর্তী উপর একই উদাহরণস্বরূপ।
//Function to get a random number
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
{
lock(syncLock) { // synchronize
return random.Next(min, max);
}
}
সম্পাদনা (মন্তব্য দেখুন): আমাদের এখানে কেন দরকার lock
?
মূলত, উদাহরণ Next
অভ্যন্তরীণ অবস্থা পরিবর্তন করতে চলেছে Random
। যদি আমরা একই সাথে একাধিক থ্রেড থেকে করি, আপনি তর্ক করতে পারেন "আমরা ফলাফলটি আরও বেশি এলোমেলো করে দিয়েছি", তবে আমরা আসলে যা করছি তা অভ্যন্তরীণ বাস্তবায়নকে সম্ভাব্যভাবে ভেঙে ফেলছে, এবং আমরাও একই সংখ্যাগুলি পেতে শুরু করতে পারি বিভিন্ন থ্রেড থেকে, যা সমস্যা হতে পারে - এবং নাও হতে পারে। অভ্যন্তরীণভাবে যা ঘটে থাকে তার গ্যারান্টি হ'ল বড় সমস্যা, যদিও; যেহেতু থ্রেড-সুরক্ষার কোনও গ্যারান্টি Random
দেয় না । সুতরাং দুটি বৈধ পন্থা আছে:
- সিঙ্ক্রোনাইজ করুন যাতে আমরা একই সাথে বিভিন্ন থ্রেড থেকে অ্যাক্সেস না করি
Random
প্রতিটি থ্রেডে পৃথক দৃষ্টান্ত ব্যবহার করুন
হয় ভাল হতে পারে; তবে একই সাথে একাধিক কলকারীদের কাছ থেকে একটি একক উদাহরণ নিঃশব্দ করা কেবল সমস্যার জন্য জিজ্ঞাসা করছে।
lock
এই অ্যাপ্রোচগুলির প্রথম (এবং সহজ) অর্জন করা; তবে, অন্য পদ্ধতির হতে পারে:
private static readonly ThreadLocal<Random> appRandom
= new ThreadLocal<Random>(() => new Random());
এটি তখন প্রতি থ্রেড, সুতরাং আপনার সিঙ্ক্রোনাইজ করার দরকার নেই।
new Random().Next((int)0xFFFF, (int)0xFFFFFF) % 256);
তুলনায় কোনো ভালো "এলোমেলো" সংখ্যা দেয় না.Next(0, 256)