2009-11-24 14 views
9

मैं सी # में एक तेज आरएनजी (यादृच्छिक संख्या जनरेटर) कैसे बना सकता हूं जो अधिकतमवैल्यू (और/या एक मिनीवैल्यू) के साथ बाइट्स की सरणी भरने का समर्थन करता है? मुझे यह http://www.codeproject.com/KB/cs/fastrandom.aspx मिला है लेकिन इसमें यह सुविधा नहीं है।फास्ट रैंडम जेनरेटर

+10

सिस्टम है। यादृच्छिक बहुत धीमी है? – driis

+0

यह बहुत अच्छा हो सकता है। वह बाइट भर रहा है, जो एक सुंदर विशेष मामला है। बाइट भरने के उद्देश्य से कोड शायद तीव्रता या अधिक तीव्रता का क्रम हो सकता है। क्या वह उस गति को _need_ करता है? मुझे नहीं पता। – Nosredna

+4

हां, सिस्टम। यादृच्छिक बहुत धीमी है। मेरे पास उत्पन्न करने के लिए कई यादृच्छिक संख्याएं हैं I – tazzo

उत्तर

23

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

सिस्टम। सामान्य उपयोग के लिए यादृच्छिक बनाया जाता है। (वास्तव में, मैं आमतौर पर सिस्टम यादृच्छिक दिनचर्या को अनजान करता हूं जब मैं उन पर गति और वितरण परीक्षण करता हूं।) ऐसे मामले हैं जहां आप कुछ और चाहते हैं। लेकिन आपको अपनी जरूरतों के बारे में बहुत स्पष्ट होना चाहिए। कितना तेज? आप क्या छोड़ने को तैयार हैं?

तुम सच में की जरूरत है "फास्ट" Marsaglia बहुत तेजी से यादृच्छिक संख्या जनरेटर है कि अपनी आवश्यकताओं के लिए अनुकूलित किया जा सकता है की एक संख्या का उत्पादन किया गया।

आखिरी व्यक्ति इस तथ्य को संबोधित करता है कि आप बाइट्स को लक्षित कर रहे हैं।

मुझे केवल कुछ बार सुपर फास्ट रैंडम्स की आवश्यकता है। धीमी प्रोसेसर के साथ कंसोल गेम में जहां यादृच्छिक फ्रेम दर लक्ष्य को मारने और इसे मारने के बीच अंतर नहीं बना सकता है। आपका उपयोग केस क्या है? हर तरह से, सिस्टम का उपयोग करें। यादृच्छिक यदि आप कर सकते हैं।

या, उस दिनचर्या को अनुकूलित करें जिसे आप अपने प्रश्न में लिंक करते हैं (जिसे लेखक का दावा सिस्टम की गति 8x है। यादृच्छिक।)

+0

वह अंतिम लिंक जांचने में काफी दिलचस्प था, +1 –

+0

आपके उत्तर के लिए धन्यवाद, आरएनजी जितना संभव हो उतना तेज़ होना चाहिए, मेरे पास कुछ सेकंड (10^9 और अधिक) में उत्पन्न होने के लिए कई यादृच्छिक संख्याएं हैं। मैंने अपने लिंक में दिनचर्या को अनुकूलित करने की कोशिश की है, लेकिन मैंने सफलता नहीं ली है, क्या आप मेरी मदद कर सकते हैं? – tazzo

+0

कई संभावनाएं हैं। कल्पना करें कि आपने सीमा के लिए यादृच्छिक संख्याओं का 4k बफर सेट किया है (कहें, 0-100)। ऑफ़सेट चुनने और पकड़ने के लिए यादृच्छिक संख्या जनरेटर का उपयोग करें, अपनी सूची से 16 बाइट्स कहें। फिर एक और ऑफसेट उत्पन्न करें और एक और 16 बाइट पकड़ो। यह _fantastically_ यादृच्छिक नहीं होगा, लेकिन यह _sufficiently_ यादृच्छिक हो सकता है। मेरे पूछने के बावजूद, आपने मुझे यह नहीं बताया है कि आप गति प्राप्त करने के लिए क्या छोड़ना चाहते हैं। इन सभी संख्याओं के साथ आप क्या करेंगे? – Nosredna

-3

आप Reflector का उपयोग System.Random से सी # तक डिकंपाइल करने के लिए कर सकते हैं। इससे आपको एक तेज़ यादृच्छिक संख्या जनरेटर का सी # कोड मिलेगा जो आपकी आवश्यकताओं को पूरा करता है।

+3

असल में, नहीं ... फ्रेमवर्क प्रीकंपिल्ड और अनुकूलित है, आप इसके साथ प्रतिस्पर्धा नहीं कर सकते (जब तक कि आप अपना कोड भी प्रीकंपल नहीं करते)। कम से कम यह अनुभव मैंने बनाया है (ढांचे को आगे बढ़ाने की कोशिश करते समय;))। – Bobby

+3

और वह वास्तव में ऐसा क्यों करेगा? संभवतः, चूंकि वह पूछता है, रैंडम बहुत धीमी है, अन्यथा वह इसका उपयोग करेगा, नहीं? –

+0

@ बॉबी: निराशाजनक, सच। अपने कोड को प्रीकंपलिंग करने में मदद नहीं मिलेगी, हालांकि। –

12

सिस्टम। यादृच्छिक किसी भी सामान्य उपयोग के लिए पर्याप्त तेज़ है। यदि आपके पास सिस्टम के साथ प्रदर्शन समस्याएं हैं जिनमें सिस्टम.रैंडम कॉल शामिल हैं, तो सुनिश्चित करें कि आप से पहले एक नया रैंडम बनाने की कोशिश कर रहे हैं। संभावना है कि आपके प्रदर्शन मुद्दे ढांचे में नहीं बल्कि आपके अपने कोड में हैं।

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

+0

मेरे कोड में केवल कुछ सेकंड में कई यादृच्छिक संख्याएं उत्पन्न हुई हैं – tazzo

+22

यह आश्चर्यजनक है कि एसओ उत्तरों में से कितने सवाल पूछने के बजाय पूछने वाले की जरूरतों के बारे में बहस करने का फैसला करते हैं। – Nosredna

+1

@tazzo: कितने लोग हैं? आप किस विशिष्ट आवश्यकताओं के बाद हैं? @ नोस्रेना: कभी-कभी प्रश्न का उत्तर देते हुए और पूछने वाले की मदद दो अलग-अलग चीजें होती है। और बहस कौन कर रहा है? –

-1

क्रिप्टोग्राफिक सेवाओं का उपयोग ....

RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider(); 
byte[] bytes= new byte[5]; 
crypto.GetBytes(bytes); 
निश्चित रूप से

, यह केवल संतुष्ट बाइट क्षेत्र आवश्यकता ...

+5

से अधिक हैं, मैंने इसे स्वयं का समय नहीं दिया है, लेकिन मुझे लगता है कि आरएनजी क्रिप्टो सेवा प्रदाता, जिसमें क्रिप्टोग्राफिक रूप से सुरक्षित होने की अतिरिक्त संपत्ति है, सिस्टम से धीमी होगी। यादृच्छिक। – SoftMemes

+0

मैंने RNGCryptoServiceProvider की जांच की है लेकिन मेरी ज़रूरतों को पूरा नहीं करता है, धीमा करना और अधिकतम यादृच्छिक संख्याओं को उत्पन्न न करें। – tazzo

0

आप एक यादृच्छिक संख्या जनरेटर है कि इकाई अंतराल से संख्या देता है, कोड परियोजना लेख आप का उल्लेख में से एक की तरह है, तो आप पहली बार एक मूल्य u कि जनरेटर का उपयोग उत्पन्न कर सकते हैं और फिर a + (b-a)*u लौटने के बीच मूल्यों को पाने के लिए ए और बी।

+0

आपका सूत्र गलत है, अगर मैं ए = 5 और बी = 20 और यू = 55 चुनता हूं तो मुझे 5+ (20-5) * 55 = 830 मिलता है। सही सूत्र यू/(यूएमएक्स + 1) * (बी-ए) + ए है जहां यूएमएक्स यादृच्छिक संख्या का अधिकतम मूल्य है। – tazzo

+1

यदि यादृच्छिक मान आप * यूनिट अंतराल * से आता है, यानी 0 और 1 के बीच, तो सूत्र सही है। आपके उदाहरण में, u = 55 0 और 1 के बीच की संख्या नहीं है। –

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