हर बार जब आप new Random()
यह करते हैं तो घड़ी का उपयोग करके इसे आरंभ किया जाता है। इसका मतलब है कि एक तंग लूप में आपको कई बार समान मूल्य मिलता है। आपको एक ही रैंडम इंस्टेंस रखना चाहिए और उसी इंस्टेंस पर नेक्स्ट का इस्तेमाल करते रहना चाहिए ।
//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)