2009-06-25 13 views
8

मैं चाहता हूं कि व्यावहारिक सी # में यादृच्छिक संख्या जनरेटर है तो मैं कह सकता हूं उदा।सी # में अर्ध यादृच्छिक संख्या उत्पन्न करने का सबसे आसान तरीका क्या है?

int dummyAge = MathHelpers.GetRandomNumber(20,70); 

और यह लगता है अर्ध यादृच्छिक, उदा डमी डेटा उत्पन्न करने के लिए।

अधिकांश stack overflow questions on this topic और वेब पर सच अनियमितता पर एक दार्शनिक विचार विमर्श में है जो नहीं मैं पल में रुचि है, उदाहरण के लिए मैं पीएचपी एक लंबे समय पहले जो मिलीसेकेंड/नींद जो डमी डेटा के लिए ठीक है, का उपयोग करता है मैं तो बस मेंसी # त्वरित यह करने के लिए कोशिश कर रहा हूँ में एक था।

किसी को भी एक त्वरित आधा सभ्य सी # यादृच्छिक संख्या जनरेटर कुछ समय बीज, आदि या, मैं निम्नलिखित कोड कैसे बदल सकता है इतना है कि यह हमेशा एक पंक्ति में एक ही 5 संख्या उत्पन्न नहीं करता है के आधार पर है ?

using System; 

namespace TestRandom23874 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.ReadLine(); 
     } 
    } 

    public class MathHelpers 
    { 
     public static int GetRandomNumber(int min, int max) 
     { 
      Random random = new Random(); 
      return random.Next(min, max); 
     } 
    } 
} 
+0

मुझे लगता है कि आपका मतलब "छद्म-यादृच्छिक" है। अर्ध-यादृच्छिक मतलब कुछ और है। –

+0

मुझे लगता है कि अर्ध ("जैसा कि, जैसा कि, जैसा कि यह अर्थ या डिग्री में था, जैसा कि कुछ समानता है)" इस अर्थ में छद्म ("वास्तविक नहीं बल्कि उपस्थिति") की तुलना में अधिक उपयुक्त है क्योंकि वे हैं औसत उपयोगकर्ता के लिए वास्तविक यादृच्छिक संख्या, लेकिन वे गणितज्ञ के लिए यादृच्छिक संख्या हैं "केवल एक मामले या डिग्री में"। –

उत्तर

13
public class MathHelpers 
    { 
     private static Random random = new Random(); 
     public static int GetRandomNumber(int min, int max) 
     { 
      return random.Next(min, max); 
     } 
    } 

इस तरह, आप एक नया रैंडम वस्तु हर बार नहीं बना रहे, बल्कि आप एक ही एक पुन: उपयोग कर रहे हैं। जब आप एक नया जल्दी जल्दी से फिर से बनाते हैं, तो वे एक ही परिणाम प्राप्त करेंगे। हालांकि, आप एक मौजूदा का पुन: उपयोग करते हैं, तो आपको यादृच्छिकता मिल जाएगी।

+0

उत्कृष्ट, मुझे बस इतना ही चाहिए, धन्यवाद! –

+1

नोट: यह सी # के लिए भी सही है लेकिन कई अन्य भाषाओं में भी (सी, सी ++, जावा, ...)। आप आमतौर पर एक बार अपने आरएनजी बीज करते हैं, और जब तक आपको इसकी आवश्यकता होती है तब तक इसका पुन: उपयोग करें। मुझे याद नहीं है कि मैंने देवताओं से संबंधित मंचों पर कितनी बार मदद मांगी क्योंकि उन्होंने अपने आरएनजी को फिर से बीज दिया। – Ksempac

+1

मुझे नहीं लगता कि यह थ्रेडसेफ है ... –

2

बीएफरी का जवाब ठीक है, लेकिन मुझे लगता है किउदाहरण को किसी स्थिर आवृत्ति के माध्यम से हमेशा एक उदाहरण का उपयोग करने के बजाय Random उदाहरण को पारित करने के लिए थोड़ा अलग पैटर्न का उल्लेख करना भी उचित है। बाद के दृष्टिकोण का नकारात्मक पक्ष यह है कि Random थ्रेड-सुरक्षित नहीं है। आपको या तो कुछ लॉकिंग, या थ्रेड-लोकल वैरिएबल की आवश्यकता है, या शुरू करने के लिए एकाधिक थ्रेड का उपयोग करने से बचें। तो मैं करने के लिए प्रश्न में मूल कोड को समायोजित करेगा:

using System; 

namespace TestRandom23874 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Random rng = new Random(); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
     } 
    } 

    public class MathHelpers 
    { 
     public static int GetRandomNumber(Random random, int min, int max) 
     { 
      return random.Next(min, max); 
     } 
    } 
} 

यह नियंत्रण से सिर्फ बुनियादी उलट है, वास्तव में। आपके पास एक स्थिर आरएनजी है जो इसे लॉक करने के साथ Random का एक नया उदाहरण उत्पन्न करने के लिए उपयोग किया जाता है, जब आपको इसकी आवश्यकता होती है (यादृच्छिक रूप से बीज उत्पन्न करके और फिर उदाहरण बनाने के लिए इसका उपयोग करके) Random का पुन: उपयोग करना संचालन के एक विशेष एकल थ्रेडेड सेट में।

+0

यदि आपको थ्रेड-सुरक्षित होने की आवश्यकता है तो अच्छा समाधान। हालांकि, मैं इस मामले में पूरी तरह से सहायक विधि को छोड़ दूंगा, क्योंकि आपकी सहायक विधि मौजूदा आइटम पर एक कॉल तक कम हो जाती है। – Ksempac

+0

ओह बिल्कुल। यह दृष्टिकोण का केवल एक उदाहरण है :) –

+0

क्या यह वास्तव में आपका 23,874 वां "टेस्टरैंडम" प्रोग्राम है? :) –

1

समस्या (5 समान संख्याओं में) एक समय की समस्या है, बीएफरी का जवाब हल करता है। रैंडम क्लास टाइमर का उपयोग करके स्वयं-बीजिंग है, आपकी कॉल एक साथ इतनी करीबी हैं कि वे एक ही बीज का उपयोग करते हैं।

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