2012-04-09 18 views
7

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

int rand = random.Next(1,100); 

निम्नलिखित इस लक्ष्य को हासिल होगा:

असल में मैं 1 और 100 के बीच उत्पन्न एक यादृच्छिक संख्या के प्रयोग पर आधारित 25% की संभावना के साथ घटना ट्रिगर करना चाहते हैं?

if (rand<=25) 
{ 
    // Some event... 
} 

मैंने सोचा कि मैं 1 और 100 के बीच एक संख्या का उपयोग करूंगा ताकि मैं बाद में संभावनाओं को ट्विक कर सकूं - उदा।

if (rand<=23) {...} 

का उपयोग करके 23% समायोजित करें।

+1

क्या आपने इसे आजमाया है? यह ठीक काम करना चाहिए। बस सावधान रहें कि आप एक छोटी सी विंडो में कई 'यादृच्छिक' उदाहरणों को फिर से नहीं बनाते हैं, या वे वही "यादृच्छिक" परिणाम वापस कर देंगे। – mellamokb

+0

मैं 1 से 4 का उपयोग नहीं करना चाहता क्योंकि मैं आवश्यकता होने पर बाद में ट्विक करना चाहता हूं, लेकिन हाँ, 1,4 वही होगा। धन्यवाद स्कॉट, मुझे याद आया। – CdrTomalak

+0

यह सही के बारे में लगता है। –

उत्तर

5

Next(int, int) का दूसरा तर्क परिणाम की वांछित सीमा के exclusive upper bound है। इसलिए आप इस का उपयोग करना चाहिए:

if (random.Next(0, 100) < 25) 

या, यदि आप 1 के आधार पर तर्क का उपयोग करना चाहिए,

if (random.Next(1, 101) <= 25) 
+0

यह दिलचस्प है, क्योंकि मैं सोच रहा था कि मैं एक ही यादृच्छिक संख्या का उपयोग करके 25% मौका घटना का प्रयास कर सकता हूं: 'if ((rand> 25) && (rand <= 50)) {...}। लेकिन मुझे लगता है कि अगर बयानों की एक श्रृंखला है तो आप सुझाव देंगे कि आप भी काम करेंगे? – CdrTomalak

+0

@CdrTomalak जो बिल्कुल काम नहीं करेगा। यदि आपका पहला कार्यक्रम * लागू किया गया था, तो अगली घटना का आह्वान करने की संभावना शून्य है। यदि पहली घटना * नहीं * लागू की गई थी, तो अगली घटना का आह्वान करने की संभावना 1/3 है।यदि आप यादृच्छिक संख्या का पुन: उपयोग करते हैं, तो ईवेंट अब स्वतंत्र रूप से यादृच्छिक नहीं होंगे; क्योंकि कोई घटना नहीं होगी कि दोनों घटनाएं हो सकती हैं। – phoog

+0

@CdrTomalak अगर दूसरी तरफ, आप यादृच्छिक रूप से चार घटनाओं में से एक का चयन करना चाहते हैं, तो आप सही रास्ते पर हैं; आपको शून्य-आधारित संख्याओं के लिए 'if (rand> = 25 && rand <50)' का उपयोग करने की आवश्यकता है, क्योंकि निचली बाउंड समावेशी है, और ऊपरी सीमा शामिल है। 1-आधारित संख्याओं के लिए, आपकी अभिव्यक्ति सही होगी। – phoog

8

सबसे बड़ी त्रुटि आप कर रहे हैं के रूप में documentation states

random.Next(0,100) होना चाहिए

minValue: यादृच्छिक संख्या की समावेशी निचली सीमा वापस आ गई।

maxValue: अनन्य यादृच्छिक संख्या के ऊपरी सीमा को वापस कर दिया गया। maxValue minValue से अधिक या बराबर होना चाहिए।

एम्फिसिस खान, विशेष अर्थ यह है कि इसमें आपके द्वारा पारित संख्या शामिल नहीं है, इसलिए मेरा कोड 0-99 की सीमा उत्पन्न करता है और आपका कोड श्रेणी 1-99 उत्पन्न करता है।

तो

int rand = random.Next(0,100) 

if (rand < 25) //25% 
{ 
    // Some event... 
} 

//other code 
if (rand < 23) //23% 
{ 
    // Some event... 
} 

क्योंकि अब आप उपयोग कर रहे हैं विशेष ऊपरी सीमा रेंज

5

आप भी इस कोड (आमतौर पर प्रतिशत की गणना के लिए डबल के बीच का उपयोग कर सकते <= से < करने के लिए परिवर्तन है करने के लिए अपने कोड बदलने 0 और 1 का उपयोग किया जाता है):

double rand = random.NextDouble(); 
if(rand < .25) 
{ 
... 
+0

यह होना चाहिए 'अगर (रैंड <.25) '; ऊपरी बाउंड अनन्य है: http://msdn.microsoft.com/en-us/library/system.random.nextdouble.aspx – phoog

+0

धन्यवाद। अगर आपको कोई फर्क नहीं पड़ता तो मैंने अपना जवाब संपादित किया। लेकिन डबल के लिए यह बहुत अंतर नहीं करता है। (अंतर केवल तभी होता है जब 0.249 99 99 99 की संख्या ... और 0.25 नाटक में आती है, जो 1/4 संभावना की तस्वीर खराब नहीं करती है) –

+0

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

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