मैं एक यादृच्छिक int संख्या कैसे उत्पन्न करूँ?


1918

मैं C # में एक यादृच्छिक पूर्णांक कैसे उत्पन्न करूं?

जवाबों:


2501

Randomवर्ग यादृच्छिक संख्या बनाने के लिए प्रयोग किया जाता है। (छद्म यादृच्छिक जो निश्चित रूप से है।)

उदाहरण:

Random rnd = new Random();
int month  = rnd.Next(1, 13);  // creates a number between 1 and 12
int dice   = rnd.Next(1, 7);   // creates a number between 1 and 6
int card   = rnd.Next(52);     // creates a number between 0 and 51

यदि आप एक से अधिक यादृच्छिक संख्या बनाने जा रहे हैं, तो आपको Randomउदाहरण रखना चाहिए और उसका पुन: उपयोग करना चाहिए । यदि आप समय में बहुत करीब नए उदाहरण बनाते हैं, तो वे यादृच्छिक संख्याओं की एक ही श्रृंखला का उत्पादन करेंगे, क्योंकि यादृच्छिक जनरेटर सिस्टम घड़ी से बीजित होता है।


183
यूनिटी C # उपयोगकर्ताओं के लिए बस एक नोट, आपको "System.Random ()" को निर्दिष्ट करना होगा क्योंकि Unity में एक "UnityEngine.Random ()" होता है जो टकराता है (ध्यान दें कि "UnityEngine.Random ()" यादृच्छिक उत्पन्न करने की क्षमता नहीं रखता है संख्या)। चूंकि एकता हमेशा डिफ़ॉल्ट रूप से सिस्टम आयात नहीं करती है इसलिए यह कुछ भ्रम पैदा कर सकता है।
जोहोते २००

2
इसे पुन: उपयोग करने के लिए, आप कोड को इनिशियलाइज़ करते समय इसे एक बार के rndरूप में घोषित कर सकते हैं staticऔर / या इसे सेट कर सकते हैं ।
19

4
@ जूनियर: हां, आप इसे पुन: उपयोग करने के लिए स्थिर कर सकते हैं, लेकिन आपको सावधान रहना होगा ताकि आप इसे कई थ्रेड से एक्सेस न करें क्योंकि यह थ्रेड सुरक्षित नहीं है (जैसा कि किसी भी वर्ग के लिए सामान्य है जो विशेष रूप से थ्रेड सुरक्षित नहीं है )।
गुफ़ा

8
मुझे लगता है कि यह एक डिस्क्लेमर जोड़ने के लिए उपयोगी होगा कि यह क्रिप्टोग्राफिक रूप से सुरक्षित नहीं है, क्योंकि यह एक लोकप्रिय सवाल है, बस अगर कोई आँख बंद करके क्रिप्टोग्राफी करने की कोशिश करता है Random...
डैनियल गार्सिया रुबियो

1
बहुत बढ़िया जवाब। Randomआपके रैंडम-नेस को और अधिक मजबूत बनाने के लिए कुछ अच्छे "एन्हांसमेंट्स" हैं : ericlippert.com/2019/02/04/fixing-random-part-2 और codeblog.jonskeet.uk/2009/11/04/reveriving -गतिहीनता
जेसी सी

280

प्रश्न बहुत सरल लगता है लेकिन उत्तर थोड़ा जटिल है। यदि आप देखते हैं कि लगभग सभी ने रैंडम क्लास का उपयोग करने का सुझाव दिया है और कुछ ने आरएनजी क्रिप्टो क्लास का उपयोग करने का सुझाव दिया है। लेकिन फिर कब क्या चुनना है।

उसके लिए हमें पहले RANDOMNESS और उसके पीछे के दर्शन को समझना होगा।

मैं आपको इस वीडियो को देखने के लिए प्रोत्साहित करूंगा जो C # https://www.youtube.com/watch?v=tCYxc-2-3fY का उपयोग करके RANDOMNESS के दर्शन में गहराई तक जाता है

पहली बात हमें RANDOMNESS के दर्शन को समझने दें। जब हम किसी व्यक्ति को RED, GREEN और YELLOW के बीच चयन करने के लिए कहते हैं तो आंतरिक रूप से क्या होता है। क्या व्यक्ति लाल या पीला या हरा रंग का चयन करता है?

c # रैंडम

कुछ प्रारंभिक विचार व्यक्तियों के दिमाग में चले जाते हैं जो उनकी पसंद को तय करते हैं, यह पसंदीदा रंग, भाग्यशाली रंग और इतने पर हो सकता है। दूसरे शब्दों में कुछ शुरुआती ट्रिगर जिसे हम रैंडम में SEED.This कहते हैं, शुरुआती बिंदु है, वह ट्रिगर जो उसे रैंडम मूल्य का चयन करने के लिए उकसाता है।

अब अगर किसी SEED का अनुमान लगाना आसान है, तो उन प्रकार के यादृच्छिक संख्याओं को PSEUDO कहा जाता है और जब एक बीज का अनुमान लगाना मुश्किल होता है तो उन यादृच्छिक संख्याओं को SECURED यादृच्छिक संख्या कहा जाता है ।

उदाहरण के लिए एक व्यक्ति चुनता है मौसम और ध्वनि संयोजन के आधार पर रंग है तो प्रारंभिक बीज का अनुमान लगाना मुश्किल होगा।

c # रैंडम

अब मुझे एक महत्वपूर्ण वक्तव्य देना है: -

"" रैंडम "वर्ग केवल PSEUDO यादृच्छिक संख्या उत्पन्न करता है और SECURE यादृच्छिक संख्या उत्पन्न करने के लिए हमें" RNGCryptoServiceProvider "वर्ग का उपयोग करने की आवश्यकता होती है।

c # रैंडम

रैंडम क्लास आपके सीपीयू घड़ी से बीज मान लेता है जो बहुत अधिक अनुमानित है। तो दूसरे शब्दों में, C # का RANDOM वर्ग छद्म यादृच्छिक संख्या उत्पन्न करता है, नीचे उसी के लिए कोड है।

** नोट: ** .NET Core 2.0.0+पैरामीटर रहित कंस्ट्रक्टर पर एक अलग बीज का उपयोग करता है: सीपीयू घड़ी के बजाय इसका उपयोग करता है Guid.NewGuid().GetHashCode()

var random = new Random();
int randomnumber = random.Next()

जबकि RNGCryptoServiceProviderवर्ग बीज उत्पन्न करने के लिए ओएस एन्ट्रापी का उपयोग करता है। ओएस एन्ट्रॉपी एक यादृच्छिक मूल्य है जो ध्वनि, माउस क्लिक और कीबोर्ड टाइमिंग, थर्मल टेम्प आदि का उपयोग करके उत्पन्न होता है। नीचे समान के लिए कोड जाता है।

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider()) 
{ 
    byte[] rno = new byte[5];    
    rg.GetBytes(rno);    
    int randomvalue = BitConverter.ToInt32(rno, 0); 
}

ओएस एन्ट्रापी को समझने के लिए 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY से इस वीडियो को देखें जहां ओएस एन्ट्रॉपी का तर्क समझाया गया है। इसलिए सरल शब्दों में कहें तो RNG Crypto SECURE रैंडम नंबर जेनरेट करता है।


9
आपका बाइट [5] केवल [4] नहीं होना चाहिए क्योंकि ToInt32 पार्स केवल 4 बाइट्स?
बर्नहार्ड

6
यह जानना हमेशा सहायक होता है कि ये वर्ग कहाँ रहते हैं। System.Security.Cryptography
Elton

1
यह सभी प्लेटफार्मों पर उपलब्ध नहीं है RandomNumberGenerator.Create(), RNGCryptoServiceProviderक्योंकि इसके निर्माता को कॉल करने के बजाय इसका उपयोग करने की सिफारिश की गई है।
dzitkowskik

मैं बस इतना चाहता हूं कि सिक्योररैंडम IS छद्म यादृच्छिक पीढ़ी है।
नोमेनोर

बीज की बढ़ी हुई यादृच्छिकता के कारण, क्या नई RNGCryptoServiceProvider ऑब्जेक्ट्स बनाना हर बार ठीक है, जब मुझे एक यादृच्छिक संख्या उत्पन्न करने की आवश्यकता होती है, या क्या अभी भी एक RNGCryptoServiceProvider ऑब्जेक्ट बनाना और जब भी मुझे एक यादृच्छिक संख्या उत्पन्न करने की आवश्यकता होती है, तब इसे पुन: उपयोग करना बेहतर होता है। रैंडम वर्ग के साथ किया जाना चाहिए?
user2150989

231

हर बार जब आप नया रैंडम करते हैं () तो इसे इनिशियलाइज़ किया जाता है। इसका मतलब है कि एक तंग लूप में आपको कई बार समान मूल्य मिलता है। आपको एक ही रैंडम इंस्टेंस रखना चाहिए और उसी इंस्टेंस पर नेक्स्ट का इस्तेमाल करते रहना चाहिए।

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}

3
क्या यह बात @Guffa ने 6 महीने पहले अपने जवाब में नहीं कही है? "यदि आप समय में बहुत करीब नए उदाहरण बनाते हैं, तो वे यादृच्छिक संख्याओं की एक ही श्रृंखला का उत्पादन करेंगे"
क्रिस

3
@ क्रिस- आपने जो कहा वही सही है। इसमें मैंने उस का कार्यान्वयन प्रदान किया है। मुझे लगता है कि यह एक अच्छा तरीका है। यह बेहतर काम करता है।
पंकज मिश्रा

22
यह एक कार्यान्वयन है जो कोड को थ्रेड से उपयोग के लिए सिंक्रनाइज़ करता है। यह बहु थ्रेडेड एप्लिकेशन के लिए अच्छा है, लेकिन एकल थ्रेडेड एप्लिकेशन के लिए समय की बर्बादी है।
गुफ़ा

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

1
@testing: मैं सहमत हूं कि पंकज का तरीका उपयोग करने के लिए सही है। मैं जो कह रहा हूं, वह यह है कि इसे सरल बनाया जा सकता है: // यादृच्छिक संख्या निजी स्थिर पढ़ने के लिए फ़ंक्शन यादृच्छिक रैंडम getrandom = नया यादृच्छिक (); सार्वजनिक स्थैतिक int GetRandomNumber (int min, int max) {लॉक (getrandom) {// सिंक्रोनाइज़ रिटर्न getrandom.Next (न्यूनतम, अधिकतम); }}
शॉन वर्ले

92

खबरदार कि new Random()वर्तमान टाइमस्टैम्प पर वरीयता प्राप्त है।

यदि आप केवल एक संख्या उत्पन्न करना चाहते हैं, जिसका आप उपयोग कर सकते हैं:

new Random().Next( int.MinValue, int.MaxValue )

अधिक जानकारी के लिए, रैंडम वर्ग को देखें, हालांकि कृपया ध्यान दें:

हालाँकि, क्योंकि घड़ी में परिमित रिज़ॉल्यूशन होता है, जो पैरामीटर रहित निर्माता का उपयोग करके अलग-अलग रैंडम ऑब्जेक्ट्स को लगातार उत्तराधिकार में बनाता है, रैंडम नंबर जेनरेटर बनाता है जो रैंडम नंबरों के समान क्रम का उत्पादन करता है।

इसलिए यादृच्छिक संख्या की एक श्रृंखला उत्पन्न करने के लिए इस कोड का उपयोग न करें।


41
-1: डिफ़ॉल्ट बीज समय पर आधारित है; लूप में ऐसा करें और आपको बहुत गैर-यादृच्छिक परिणाम मिलेंगे। आपको एक जनरेटर बनाना चाहिए और इसे अपने सभी नंबरों के लिए उपयोग करना चाहिए , हर बार एक अलग जनरेटर नहीं।
बेवन

21
अरे, यह अनुचित है। सवाल था कि रैंडम इंट नंबर कैसे जनरेट किया जाए। किसी भी छोर या श्रृंखला का उल्लेख नहीं किया गया था।
फ्योडोर सोइकिन

26
ठीक है, उचित बिंदु। इसे रद्द कर दिया। हालांकि, मुझे अभी भी लगता है कि new Random()लूप में उपयोग नहीं करना एक महत्वपूर्ण बिंदु है।
बेवन

भविष्य में इस पर आने वालों के लिए, यह अब स्पष्ट होना चाहिए, लेकिन मैं इसे इंगित करूंगा; उत्तर को इस बिंदु के साथ अद्यतन किया गया था, इसे कई मूल्यों के लिए लूप में उपयोग नहीं करने के लिए।
vapcguy


30

मैं एक गुप्त रूप से सुरक्षित संस्करण जोड़ना चाहता था:

RNGCryptoServiceProvider वर्ग ( MSDN या dotnetperls )

यह आईडीआईसोपायरी को लागू करता है।

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}

15

आप MiscUtil क्लास लाइब्रेरी के अंदर जॉन स्कीट के स्टैटिकट्रैंडिक तरीके का उपयोग कर सकते हैं जिसे उन्होंने एक छद्म यादृच्छिक संख्या के लिए बनाया था।

using MiscUtil;
...

for (int i = 0; i < 100; 
    Console.WriteLine(StaticRandom.Next());

31
मेरे पास स्रोत कोड पर एक नज़र थी, और यह फ़ंक्शन ठीक उसी यादृच्छिक संख्या इंजन का उपयोग करता है, जो सी # में "शामिल" है, लेकिन यह सुनिश्चित करता है कि सभी कॉल के लिए समान "बीज" / "मदर ऑब्जेक्ट" का उपयोग किया जाता है। (मुझे खेद है कि मैं सी # शब्दावली नहीं जानता। लेकिन मेरा कहना है कि यह फ़ंक्शन मानक फ़ंक्शन की तुलना में कोई बेहतर यादृच्छिक संख्या नहीं बनाता है।)
एंड्रियास रिब्रांडैंड

5
किसी भी चीज के लिए 'वास्तव में यादृच्छिक' होना असंभव है क्योंकि इसमें हमेशा कुछ सीमित कारक या पूर्वाग्रह शामिल होते हैं जो इसके बहुत ही अस्तित्व से निहित है। क्या आपने शिक्षक को विज्ञान की कक्षाओं में नहीं सुना? ;-)
फ़िल हेले

बता दें, उनके अनुसार यह 'सच में बेतरतीब' है जैसा कि यह मिलता है
द मित्रा बॉय

अब टूटी हुई कड़ी। यही कारण है कि आप अपने उत्तर में मिली जानकारी को शामिल करते हैं।
vapcguy

13

मैंने COBOL उत्तर ... lol को छोड़कर इन सभी समाधानों की कोशिश की है

इनमें से कोई भी समाधान पर्याप्त नहीं था। मुझे इंट लूप के लिए एक फास्ट में रैंडम की जरूरत थी और मुझे बहुत व्यापक रेंज में भी डुप्लिकेट वैल्यू मिल रही थी। अभी तक बहुत सारे यादृच्छिक परिणामों के लिए बसने के बाद, मैंने आखिरकार एक बार और सभी के लिए इस समस्या से निपटने का फैसला किया।

यह सब बीज के बारे में है।

मैं दिशानिर्देश से गैर-अंकों को पार्स करके एक यादृच्छिक पूर्णांक बनाता हूं, फिर मैं इसका उपयोग अपने यादृच्छिक वर्ग को तुरंत करने के लिए करता हूं।

public int GenerateRandom(int min, int max)
{
    var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
    return new Random(seed).Next(min, max);
}

अद्यतन : यदि आप रैंडम क्लास को एक बार इंस्टेंट करते हैं तो सीडिंग आवश्यक नहीं है। तो यह एक स्थिर वर्ग बनाने और बंद करने के लिए एक विधि को कॉल करने के लिए सबसे अच्छा होगा।

public static class IntUtil
{
   private static Random random;

   private static void Init()
   {
      if (random == null) random = new Random();
   }

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

तो आप इस तरह स्थिर वर्ग का उपयोग कर सकते हैं ..

for(var i = 0; i < 1000; i++)
{
   int randomNumber = IntUtil.Random(1,100);
   Console.WriteLine(randomNumber); 
}

मैं मानता हूं कि मुझे यह तरीका बेहतर लगता है।


6
मार्गदर्शन यादृच्छिक नहीं है, यह एक अच्छा बीज नहीं है। एक GUID यादृच्छिकता के बारे में गारंटी नहीं देता है, यह विशिष्टता के आसपास की गारंटी देता है। stackoverflow.com/questions/2621563/...
Magu

2
मार्गदर्शन एक अच्छा बीज है। मैं केवल गाइड में संख्याओं का उपयोग कर रहा हूं। खुद के लिए विधि का प्रयास करें। इसे लंबे समय तक लूप में रखें और अपने लिए परिणाम देखें।
प्रोमेसियो

1
हम्म, दूसरे विचार पर .. बीज बिल्कुल आवश्यक नहीं है। अद्यतन उत्तर
प्रोमिसो

1
अद्यतन पर महान बिंदु। मैंने इसे एक स्थिर क्षेत्र बनाने के लिए भी नहीं सोचा था, यह तरीका बहुत बेहतर है और क्लीनर है।
18

1
इस जवाब के साथ कुछ समस्याएं हैं। सबसे पहले GUID एक महान बीज स्रोत नहीं है - सिर्फ इसलिए कि यह यादृच्छिक लगता है इसका मतलब यह नहीं है। यह आपकी व्यक्तिगत जरूरतों के लिए काफी अच्छा हो सकता है। दूसरे रैंडम वर्ग सुरक्षित धागा नहीं है। आपको प्रति थ्रेड एक बार इसे तुरंत करने की आवश्यकता है।
हेक्टर

11

इनबिल्ट Randomक्लास (System.Random) द्वारा उत्पन्न संख्याएँ छद्म यादृच्छिक संख्याएँ उत्पन्न करती हैं।

यदि आप सही यादृच्छिक संख्याएँ चाहते हैं, तो निकटतम हम प्राप्त कर सकते हैं "सुरक्षित छद्म यादृच्छिक जनरेटर" जो C # में क्रिप्टोग्राफ़िक कक्षाओं का उपयोग करके उत्पन्न किया जा सकता है RNGCryptoServiceProvider

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


11

रैंडम ऑब्जेक्ट बनाएँ

Random rand = new Random();

और इसका उपयोग करें

int randomNumber = rand.Next(min, max);

आपको new Random()हर बार जब आपको एक यादृच्छिक संख्या की आवश्यकता होती है, तो एक बार रैंडम करने की आवश्यकता नहीं होती है, फिर जितनी बार आपको एक लूप के अंदर की आवश्यकता होती है उतनी बार उपयोग करें


5
new Random()बीज के रूप में वर्तमान टिक्स का उपयोग करता है। जब आप एक ही मिलीसेकंड के भीतर (उदाहरण के लिए टिक के विपरीत) कई उदाहरणों को पलटा देते हैं, तो आपको समान मूल्य वापस मिल जाएगा।
हंस के Hans आईएनजी

10
यह सक्रिय रूप से खराब है। DateTime.Now.Millisecond (DateTime.Now.Ticks के विपरीत) 0 और 999 के बीच की एक संख्या है। यदि आप प्रत्येक यादृच्छिक संख्या के लिए इनमें से एक नया बना रहे हैं, तो आपके पास केवल 1000 संभावनाएँ होंगी।
ओरेन मेल्ज़र

इस जवाब को अप-वोट करने में 24 लोग क्या सोच रहे थे ...?
स्फूर्ति

10

यहाँ से संशोधित उत्तर ।

यदि आपके पास इंटेल सिक्योर कुंजी संगत सीपीयू तक पहुंच है, तो आप इन पुस्तकालयों का उपयोग करके वास्तविक यादृच्छिक संख्या और तार उत्पन्न कर सकते हैं: https://github.com/JebteK/RdRand और https://www.rdrand.com/

बस यहाँ से नवीनतम संस्करण को डाउनलोड करें , Jebtek.RdRand को शामिल करें और इसके लिए एक उपयोग कथन जोड़ें। फिर, आपको बस इतना करना है:

// Check to see if this is a compatible CPU
bool isAvailable = RdRandom.GeneratorAvailable();

// Generate 10 random characters
string key       = RdRandom.GenerateKey(10);

 // Generate 64 random characters, useful for API keys 
string apiKey    = RdRandom.GenerateAPIKey();

// Generate an array of 10 random bytes
byte[] b         = RdRandom.GenerateBytes(10);

// Generate a random unsigned int
uint i           = RdRandom.GenerateUnsignedInt();

यदि आपके पास कोड को निष्पादित करने के लिए एक संगत CPU नहीं है, तो बस rdrand.com पर RESTful सेवाओं का उपयोग करें। आपकी परियोजना में शामिल RdRandom आवरण पुस्तकालय के साथ, आपको बस यह करने की आवश्यकता होगी (साइनअप करने पर आपको 1000 मुफ्त कॉल प्राप्त होंगे):

string ret = Randomizer.GenerateKey(<length>, "<key>");
uint ret   = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");

7

मैंने एक यादृच्छिक संख्या (अनुशंसित नहीं) के लिए नीचे दिए गए कोड का उपयोग किया:

var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);

4

जबकि यह ठीक है:

Random random = new Random();
int randomNumber = random.Next()

आप अधिकतर समय सीमा (न्यूनतम और अधिकतम माप) को नियंत्रित करना चाहते हैं। इसलिए आपको यह निर्दिष्ट करने की आवश्यकता है कि यादृच्छिक संख्या कहां शुरू और समाप्त होती है।

Next()विधि दो पैरामीटर, न्यूनतम और अधिकतम स्वीकार करता है।

इसलिए अगर मैं चाहता हूं कि मेरा रैंडम नंबर 5 और 15 के बीच हो, तो मैं अभी करूंगा

int randomNumber = random.Next(5, 16)

4

यह वह वर्ग है जिसका मैं उपयोग करता हूं। की तरह काम करता हैRandomNumber.GenerateRandom(1, 666)

internal static class RandomNumber
{
    private static Random r = new Random();
    private static object l = new object();
    private static Random globalRandom = new Random();
    [ThreadStatic]
    private static Random localRandom;
    public static int GenerateNewRandom(int min, int max)
    {
        return new Random().Next(min, max);
    }
    public static int GenerateLockedRandom(int min, int max)
    {
        int result;
        lock (RandomNumber.l)
        {
            result = RandomNumber.r.Next(min, max);
        }
        return result;
    }
    public static int GenerateRandom(int min, int max)
    {
        Random random = RandomNumber.localRandom;
        if (random == null)
        {
            int seed;
            lock (RandomNumber.globalRandom)
            {
                seed = RandomNumber.globalRandom.Next();
            }
            random = (RandomNumber.localRandom = new Random(seed));
        }
        return random.Next(min, max);
    }
}

आपका GenerateRandom वर्ग 666 नंबर, केवल 665 कभी नहीं लौटाएगा। यह रैंडम.नेक्स्ट अधिकतम मूल्य की आम गलतफहमी (सुविधा) है।
गॉर्डन बेल

3

मैं यह प्रदर्शित करना चाहता था कि जब हर बार एक नया यादृच्छिक जनरेटर उपयोग किया जाता है तो क्या होता है। मान लीजिए कि आपके पास दो तरीके हैं या दो वर्गों में से प्रत्येक में एक यादृच्छिक संख्या की आवश्यकता होती है। और भोलेपन से आप उन्हें कोड करते हैं:

public class A
{
    public A()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}

क्या आपको लगता है कि आपको दो अलग-अलग आईडी मिलेंगे? नहींं

class Program
{
    static void Main(string[] args)
    {
        A a=new A();
        B b=new B();

        int ida=a.ID, idb=b.ID;
        // ida = 1452879101
        // idb = 1452879101
    }
}

समाधान हमेशा एक ही स्थिर यादृच्छिक जनरेटर का उपयोग करना है। ऐशे ही:

public static class Utils
{
    public static readonly Random random=new Random();
}

public class A
{
    public A()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}

फिर आप सुरक्षित रूप से एक बीज का चयन कैसे करते हैं?
j7272

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

रेडियोएक्टिव क्षय (जो बहुत यादृच्छिक है) के आधार पर संख्याओं को यादृच्छिक बनाने के लिए एक छोटे अल्फा कण रेडियोधर्मी स्रोत और एक डिटेक्टर (स्मोक डिटेक्टर काम करता है) के साथ एक रैंडमाइज़र चिप होना अच्छा होगा।
ja72

3

मजबूत यादृच्छिक बीज के लिए मैं हमेशा CryptoRNG का उपयोग करता हूं और समय का नहीं।

using System;
using System.Security.Cryptography;

public class Program
{
    public static void Main()
    {
        var random = new Random(GetSeed());
        Console.WriteLine(random.Next());
    }

    public static int GetSeed() 
    {
        using (var rng = new RNGCryptoServiceProvider())
        {
            var intBytes = new byte[4];
            rng.GetBytes(intBytes);
            return BitConverter.ToInt32(intBytes, 0);
        }
    }
}

3
Random random = new Random ();
int randomNumber = random.Next (lowerBound,upperBound);

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, यह समझाने के लिए बेहतर है कि समस्या को कैसे हल किया जाए और उदाहरण या संदर्भ के रूप में कोड प्रदान किया जाए। कोड-केवल उत्तर भ्रामक और संदर्भ की कमी हो सकते हैं।
रॉबर्ट कोलंबिया

3

बस भविष्य के संदर्भ के लिए एक नोट के रूप में।

यदि आप .NET कोर का उपयोग कर रहे हैं, तो कई रैंडम उदाहरण पहले की तरह खतरनाक नहीं हैं। मुझे पता है कि यह प्रश्न 2010 का है, लेकिन चूंकि यह प्रश्न पुराना है, लेकिन इसमें कुछ आकर्षण है, इसलिए मुझे लगता है कि यह बदलाव का दस्तावेजीकरण करना अच्छी बात है।

आप इस सवाल का उल्लेख कर सकते हैं मैंने कुछ समय पहले किया था:

क्या Microsoft ने रैंडम डिफॉल्ट सीड को बदला?

मूल रूप से, उन्होंने डिफ़ॉल्ट बीज को से बदल दिया Environment.TickCountहैGuid.NewGuid().GetHashCode() , इसलिए यदि आप रैंडम के 2 उदाहरण बनाते हैं तो यह समान संख्याओं को प्रदर्शित नहीं करेगा।

आप फ़ाइल को .NET फ्रेमवर्क / .NET कोर (2.0.0+) से अलग देख सकते हैं: https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac006565268554de49162c539ff66d

यह RNGCryptoServiceProvider जितना सुरक्षित नहीं है, लेकिन कम से कम यह आपको अजीब परिणाम नहीं देगा।


यह अब पुराना है। Guids का उपयोग करने के खिलाफ काफी प्रतिक्रिया थी। कोड अब है Interop.GetRandomBytes((byte*)&result, sizeof(int));
Enigmativity

2

कंप्यूटर द्वारा एक नियतात्मक प्रक्रिया के माध्यम से गणना की गई संख्या, परिभाषा के अनुसार, यादृच्छिक नहीं हो सकती।

यदि आप एक वास्तविक यादृच्छिक संख्या चाहते हैं, तो यादृच्छिकता वायुमंडलीय शोर या रेडियोधर्मी क्षय से आती है।

आप उदाहरण के लिए RANDOM.ORG की कोशिश कर सकते हैं (यह प्रदर्शन को कम करता है)


2
Random rand = new Random();
int name = rand.Next()

दूसरे कोष्ठकों में आप जो भी मूल्य चाहते हैं, उसे सुनिश्चित करें कि आपने कोड बनाने के लिए प्रोप और डबल टैब लिखकर नाम निर्धारित किया है


1
प्रोप और डबल टैब?
डीसीशनॉन

प्रोप और डबल टैब क्यों ? क्या आप उस कीबोर्ड शॉर्टकट के बिना कह रहे हैं, जो संपत्ति के लिए शॉर्ट-हैंड है, आपका कोड काम नहीं करेगा?
14

2

यदि आप एक न्यूनतम और अधिकतम के बीच यादृच्छिक संख्या उत्पन्न करने के लिए CSRNG चाहते हैं, तो यह आपके लिए है। यह Randomसुरक्षित यादृच्छिक बीजों के साथ कक्षाओं को इनिशियलाइज़ करेगा ।

    class SecureRandom : Random
    {
        public static byte[] GetBytes(ulong length)
        {
            RNGCryptoServiceProvider RNG = new RNGCryptoServiceProvider();
            byte[] bytes = new byte[length];
            RNG.GetBytes(bytes);
            RNG.Dispose();
            return bytes;
        }
        public SecureRandom() : base(BitConverter.ToInt32(GetBytes(4), 0))
        {

        }
        public int GetRandomInt(int min, int max)
        {
            int treashold = max - min;
            if(treashold != Math.Abs(treashold))
            {
                throw new ArithmeticException("The minimum value can't exceed the maximum value!");
            }
            if (treashold == 0)
            {
                throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
            }
            return min + (Next() % treashold);
        }
        public static int GetRandomIntStatic(int min, int max)
        {
            int treashold = max - min;
            if (treashold != Math.Abs(treashold))
            {
                throw new ArithmeticException("The minimum value can't exceed the maximum value!");
            }
            if(treashold == 0)
            {
                throw new ArithmeticException("The minimum value can't be the same as the maximum value!");
            }
            return min + (BitConverter.ToInt32(GetBytes(4), 0) % treashold);
        }
    }

1

क्षमा करें, ओपी को वास्तव में एक यादृच्छिक intमूल्य की आवश्यकता होती है , लेकिन ज्ञान साझा करने के सरल उद्देश्य के लिए यदि आप एक यादृच्छिक BigIntegerमूल्य चाहते हैं तो आप निम्नलिखित कथन का उपयोग कर सकते हैं:

BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));

0

मुझे लगता है कि आप नीचे की तरह समान रूप से वितरित यादृच्छिक संख्या जनरेटर चाहते हैं। C # और C ++ सहित अधिकांश प्रोग्रामिंग भाषा में रैंडम नंबर का उपयोग करने से पहले ठीक से फेरबदल नहीं किया जाता है। इसका मतलब है कि आपको एक ही नंबर बार-बार मिलेगा, जो वास्तव में यादृच्छिक नहीं है। एक ही नंबर को बार-बार ड्रा करने से बचने के लिए आपको एक बीज की आवश्यकता होती है। आमतौर पर, इस कार्य के लिए समय में टिक ठीक है। याद रखें कि यदि आप हर बार एक ही बीज का उपयोग कर रहे हैं तो आपको एक ही नंबर मिलेगा। इसलिए हमेशा अलग बीज का उपयोग करने का प्रयास करें। समय बीज के लिए एक अच्छा स्रोत है क्योंकि वे हमेशा पीछा करते हैं।

int GetRandomNumber(int min, int max)
{
    Random rand = new Random((int)DateTime.Now.Ticks);
    return rand.Next(min, max);
}

यदि आप सामान्य वितरण के लिए यादृच्छिक संख्या जनरेटर की तलाश कर रहे हैं, तो आप बॉक्स-मुलर परिवर्तन का उपयोग कर सकते हैं। यादृच्छिक गाऊसी चर प्रश्न में yoyoyoyosef द्वारा उत्तर की जाँच करें। चूंकि आप पूर्णांक चाहते हैं, इसलिए आपको अंत में पूर्णांक के लिए डबल मान देना होगा।

Random rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
         Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
         mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)

यादृच्छिक गाऊसी चर


0

सबसे आसान तरीका शायद Random.range(1, 3)यह है कि यह 1 और 2 के बीच एक संख्या उत्पन्न करेगा।


-1

आप नीचे उपयोग करके यादृच्छिक बीज मूल्य के साथ कोशिश कर सकते हैं:

var rnd = new Random(11111111); //note: seed value is 11111111

string randomDigits = rnd.Next();

var requestNumber = $"SD-{randomDigits}";

धन्यवाद @ MikaelDúiBolinder इस स्निपेट को देखने के लिए
रेजवानुल रेजा

-2

उपयोग क्यों नहीं int randomNumber = Random.Range(start_range, end_range)?


वास्तव में int randomNumber = random.Range (start_range, end_range + 1)
गॉर्डन बेल

3
क्या रैंडम.रेंज () मौजूद है? मैं इसे MSDN प्रलेखन में नहीं मिला।
फिलिप नगन

मैं MSDN प्रलेखन में रैंडम.रेंज () भी नहीं पा सका
user2455111

-2

रैंडम के एक उदाहरण का बार-बार उपयोग करें

// Somewhat better code...
Random rng = new Random();
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(GenerateDigit(rng));
}
...
static int GenerateDigit(Random rng)
{
    // Assume there'd be more logic here really
    return rng.Next(10);
}

यह लेख इस बात पर ध्यान देता है कि यादृच्छिकता इतनी समस्याओं का कारण बनती है, और उन्हें कैसे संबोधित किया जाए। http://csharpindepth.com/Articles/Chapter12/Random.aspx


Randomएक धागा सुरक्षित वर्ग नहीं है। यदि आप एक एकल उदाहरण बनाते हैं, तो आपको लॉकिंग तंत्र के पीछे पहुंच को प्रतिबंधित करना चाहिए।
ब्रैड एम

-2

यादृच्छिक संख्या बनाने के लिए इन सरल चरणों का प्रयास करें:

समारोह बनाएँ:

private int randomnumber(int min, int max)
{
    Random rnum = new Random();
    return rnum.Next(min, max);
}

उपरोक्त फ़ंक्शन का उपयोग उस स्थान पर करें जहां आप यादृच्छिक संख्याओं का उपयोग करना चाहते हैं। मान लीजिए आप इसे टेक्स्ट बॉक्स में उपयोग करना चाहते हैं।

textBox1.Text = randomnumber(0, 999).ToString();

0 मिनट है और 999 अधिकतम है। आप जो चाहें वो मान बदल सकते हैं।


यह उसी समय वापस आएगा जब एक साथ कई बार बारीकी से बुलाया जाएगा क्योंकि यह बीज के रूप में सिस्टम समय का उपयोग करता है ...
MOnsDaR

1
randomnumber (0, 999) 999 कभी नहीं लौटेगा। अधिकतम मूल्य समावेशी नहीं है। यह Random.Next अधिकतम मान की आम गलतफहमी (सुविधा) है।
गॉर्डन बेल

-2

मेरे पास हमेशा ऐसे तरीके होते हैं जो यादृच्छिक संख्याएं उत्पन्न करते हैं जो विभिन्न उद्देश्यों के लिए मदद करते हैं। मुझे आशा है कि यह आपकी भी मदद कर सकता है:

public class RandomGenerator  
{  
    public int RandomNumber(int min, int max)  
    {  
        var random = new Random();  
        return random.Next(min, max);  
    }  

    public string RandomString(int size, bool lowerCase)  
    {  
        var builder = new StringBuilder();  
        var random  = new Random();  
        char ch;  

        for (int i = 0; i < size; i++)  
        {  
            ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));  
            builder.Append(ch);  
        }  

        if (lowerCase)  
            return builder.ToString().ToLower();  
        return builder.ToString();  
    }  
}

-3

इनलाइन के लिए त्वरित और आसान, बलो कोड का उपयोग करें:

new Random().Next(min, max);

// for example unique name
strName += "_" + new Random().Next(100, 999);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.