2010-07-10 14 views
5

मैं सी # डब्ल्यू/एक्सएनए में पोंग पर काम कर रहा हूं।मैं सी # में यादृच्छिक संख्या का उपयोग कैसे करूं?

मैं गेंद को सीधे या किसी कोण पर चीजों को निर्धारित करने के लिए यादृच्छिक संख्या (एक सीमा के भीतर) का उपयोग करना चाहता हूं, और जब यह पैडल हिट करता है तो गेंद कितनी तेजी से चलती है।

मैं जानना चाहता हूं कि इसे कैसे कार्यान्वित किया जाए।

+10

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

+1

@Esteban नहीं अगर यह एक्सट्रीम पोंग है! – Grokodile

+0

इसकी वर्तमान स्थिति में, गेंद हिट होने पर पैडल चल रहा है या नहीं, इस पर निर्भर करता है। लेकिन अगर न तो पैडल चले गए, तो गेंद सीधे बदलाव नहीं करेगी। मैं कोण बदलने के लिए एक यादृच्छिक संख्या का उपयोग करना चाहता था। – Slateboard

उत्तर

14

Random कक्षा का उपयोग करें।

Random r = new Random(); 
int nextValue = r.Next(0, 100); // Returns a random number from 0-99 
+3

यह ध्यान देने योग्य है कि आपको केवल एक * एकल उदाहरण * रैंडम (प्रति थ्रेड) बनाना चाहिए। सरल, एकल-थ्रेडेड गेम के लिए, इसे व्युत्पन्न गेम क्लास का 'सार्वजनिक स्थैतिक रीडोनली' सदस्य बनाते हुए मैं आमतौर पर करता हूं। जॉन स्कीट का जवाब भी देखें: http://stackoverflow.com/questions/3217651/how-do-i-use-random-numbers-in-c/3218084#3218084 –

1
Random rnd = new Random(); 
rnd.Next(minValue, maxValue); 

यानी

rnd.Next(1,10); 
1

उपयोग रैंडम वस्तु की Next विधि है कि एक मिनट लेता है और अधिकतम और उस रेंज में एक मूल्य:

var random = new Random();  
int randomNum = random.Next(min, max); 
1

उदाहरण के लिए जबकि आप सभी की तरह Random कक्षा का उपयोग कर सकते हैं अन्य सुझाव दे रहे हैं, Random वर्ग केवल psuedo- यादृच्छिक संख्या पीढ़ी का उपयोग करता है। RandomNumberGenerator, जो System.Security.Cryptography नामस्थान में पाया जा सकता है, वास्तविक यादृच्छिक संख्या बनाता है।

उपयोग कैसे करें:

RandomNumberGenerator rng = RandomNumberGenerator.Create(); 
byte[] rand = new byte[25]; //Set the length of this array to 
          // the number of random numbers you want 
rng.GetBytes(rand); 

अधिक जानकारी: http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator(v=VS.80).aspx

+0

रैंडम नम्बर जेनरेटर एक सार श्रेणी है। :) इस वर्ग से प्राप्त RNGCryptoServiceProvider का उपयोग करें।फिर भी यह अभी भी "क्रिप्टोग्राफिक रूप से मजबूत" यादृच्छिक संख्याएं उत्पन्न करता है, जो अभी भी छद्म यादृच्छिक है। और http://stackoverflow.com/questions/418817/pros-and-cons-of-rngcryptoserviceprovider के अनुसार, इस मामले के लिए RNGCryptoServiceProvider धीमा और अधिक है। –

+0

यह अधिक यादृच्छिक होगा लेकिन प्रदर्शन प्रदर्शन हो सकता है, इसलिए तदनुसार संतुलन। आपको इस रैंडमनेस की आवश्यकता नहीं हो सकती है और यह रैंडम – TJB

+0

के रूप में उपयोग करने में काफी आसान नहीं हो सकता है, मैंने सोचा कि मैं इसे एक विकल्प के रूप में वहां से बाहर करूँगा। ईमानदार होने के लिए, शायद मैं रैंडम का भी उपयोग करता हूं। –

7

जब तक आप को क्रिप्टोग्राफी सुरक्षित संख्या की जरूरत है, Random आप के लिए ठीक होना चाहिए ... लेकिन वहाँ के बारे में पता होने के लिए दो gotchas हैं:

  • आपको हर बार एक नया उदाहरण नहीं बनाना चाहिए। यदि आप बीज निर्दिष्ट किए बिना एक उदाहरण बनाते हैं, तो यह वर्तमान समय बीज के रूप में उपयोग करेगा - जिसका अर्थ है कि यदि आप त्वरित उत्तराधिकार में कई उदाहरण बनाते हैं, तो उनमें से कई संख्याओं के समान अनुक्रम का उत्पादन करेंगे। आम तौर पर आप Random का दीर्घकालिक उदाहरण बनाते हैं और इसका पुन: उपयोग करते हैं।
  • यह थ्रेड-सुरक्षित नहीं है। यदि आपको एकाधिक धागे से यादृच्छिक संख्याएं उत्पन्न करने की आवश्यकता है, तो आपको प्रति थ्रेड एक उदाहरण होने के बारे में सोचना चाहिए। अधिक जानकारी के लिए this blog post पढ़ें - लेकिन सुनिश्चित करें कि आप टिप्पणियां भी पढ़ते हैं, क्योंकि उनके पास बहुत उपयोगी जानकारी है।
+0

+1। उत्कृष्ट सुझाव; मैंने देखा है कि लोग उस समय और समय से फिर से काटते हैं। मेरा पसंदीदा गलती है w/यादृच्छिक तब होता है जब लोग इसे एक तंग पाश के अंदर तुरंत चालू करते हैं और बीज को दिनांक/दिनांक दिनांक.अब उम्मीद करते हैं कि इससे समस्या ठीक हो जाएगी। :) –

0

यहाँ मेरी यादृच्छिक जनरेटर

private static Random rnd = new Random(Environment.TickCount); 

private int RandomNum(int Lower, int Upper) 
{ 

return rnd.Next(Lower, Upper);//MyRandomNumber; 

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