2010-06-10 18 views
16

मान लें कि मैं एक साधारण भाग्य गेम लिख रहा हूं - प्रत्येक खिलाड़ी एंटर दबाता है और गेम उसे 1-6 के बीच यादृच्छिक संख्या निर्दिष्ट करता है। एक घन की तरह। खेल के अंत में, उच्चतम संख्या वाला खिलाड़ी जीतता है।संभाव्यता यादृच्छिक संख्या जेनरेटर

अब, मान लीजिए कि मैं एक धोखेबाज हूं। मैं खेल लिखना चाहता हूं तो खिलाड़ी # 1 (जो मुझे होगा) में शेष संख्याओं (1, 2, 3, 4, 5) प्राप्त करने के लिए 9 0% और 2% की संभावना है।

मैं एक संख्या यादृच्छिक कैसे उत्पन्न कर सकता हूं, और प्रत्येक संख्या के लिए संभावना निर्धारित कर सकता हूं?

+3

+1 प्राप्त करने के लिए 50% होगा "चलो कहते हैं कि मैं एक बेईमान हूँ चलो । " –

उत्तर

18
static Random random = new Random(); 

static int CheatToWin() 
{ 
    if (random.NextDouble() < 0.9) 
     return 6; 

    return random.Next(1, 6); 
} 

एक और अनुकूलन रास्ता धोखा देने के लिए:

static int IfYouAintCheatinYouAintTryin() 
{ 
    List<Tuple<double, int>> iAlwaysWin = new List<Tuple<double, int>>(); 
    iAlwaysWin.Add(new Tuple<double, int>(0.02, 1)); 
    iAlwaysWin.Add(new Tuple<double, int>(0.04, 2)); 
    iAlwaysWin.Add(new Tuple<double, int>(0.06, 3)); 
    iAlwaysWin.Add(new Tuple<double, int>(0.08, 4)); 
    iAlwaysWin.Add(new Tuple<double, int>(0.10, 5)); 
    iAlwaysWin.Add(new Tuple<double, int>(1.00, 6)); 

    double realRoll = random.NextDouble(); // same random object as before 
    foreach (var cheater in iAlwaysWin) 
    { 
     if (cheater.Item1 > realRoll) 
      return cheater.Item2; 
    } 

    return 6; 
} 
+1

यह खराब अनुकूलन योग्य है – Andrey

+2

ओह, निश्चित रूप से, एक * अनुकूलन * धोखा देने का तरीका। मैं एक जोड़ दूंगा। –

+1

@ एंड्रे: और फिर भी, चूंकि यह छद्म कोड नहीं है, यह एक छद्म उत्तर नहीं है। :) – MusiGenesis

3

आपके पास कुछ विकल्प है, लेकिन एक तरह से 1 और 100 के बीच की एक संख्या खींच, और कहा कि आवंटित करने के लिए एक पासा करने के लिए अपने वजन का उपयोग किया जाएगा चेहरा संख्या

तो

1,2 = 1 
3,4 = 2 
5,6 = 3 
7,8 = 4 
9,10 = 5 
11-100 = 6 

यह आप अनुपात आप की जरूरत देना होगा, और यह भी बाद में काफी धुन करने के लिए आसान हो जाएगा।

+1

यह सबसे सरल और सबसे आम दृष्टिकोण है। इसे कभी-कभी * संभाव्यता वितरण वेक्टर * कहा जाता है। व्यावहारिक रूप से, अधिकांश कार्यान्वयन एक श्रेणी शब्दकोश का उपयोग करते हैं, और यादृच्छिक रूप से जेनरेट किए गए मान के आधार पर उसमें एक लुकअप करते हैं। – LBushkin

2

यदि वितरण की सरणी (स्यूडोकोड) को परिभाषित कर सकते हैं:,

// निष्पक्ष वितरण

array = {0.1666, 0.1666, 0.1666, 0.1666, 0.1666, 0.1666 }; 

तो 0 से पासा 1 रोल एक्स को बचाने के तो

float sum = 0; 
for (int i = 0; i < 6;i++) 
{ 
    sum += array[i]; 
    if (sum > x) break; 
} 

मैं पासा संख्या है।

अब अगर आप को बदलने के लिए सरणी धोखा देने के लिए चाहते हैं

:

array = {0.1, 0.1, 0.1, 0.1, 0.1, 0.5 }; 

और आप 6 के लिए (16 के बजाय%)

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