2009-06-17 11 views
6

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

उत्तर

5

आप भद्दा अनियमितता कोई आपत्ति नहीं है, एक क्लासिक विधि

x[n+1] = (x[n] * x[n] + C) mod N 

जहां सी और एन स्थिरांक हैं, सी! = 0 -2 और सी! =, और एन प्रमुख है। पोलार्ड Rho फैक्टरिंग के लिए यह एक ठेठ छद्म यादृच्छिक जनरेटर है। सी = 1 और एन = 8051 आज़माएं, वे ठीक काम करते हैं।

+0

जो कि यादृच्छिक लगता है, धन्यवाद! – Martin

+0

निश्चित रूप से। ग्राफिक्स के लिए आपको बड़ी सांख्यिकीय गुणवत्ता की आवश्यकता नहीं है। –

2

वर्टेक्स शेडर्स में कभी-कभी शोर जनरेटर का उपयोग करने के लिए आपके पास उपयोग किया जाता है, जैसे सीजी के noise() फ़ंक्शन।

+0

एचएलएसएल में शोर फ़ंक्शन होता है जिसका उपयोग मैं कर सकता था: http://msdn.microsoft.com/en-us/library/bb509629(VS.85).aspx हालांकि जब भी मैंने इसे अतीत में उपयोग किया है वास्तव में कभी काम नहीं किया, वास्तव में मुझे विश्वास है कि इसे "अभी तक लागू नहीं किया गया" के रूप में चिह्नित किया गया था! – Martin

2

उपयोग एक linear congruential generator:

X_(n+1) = (a * X_n + c) mod m 

उन है कि मजबूत नहीं हैं, लेकिन कम से कम वे अच्छी तरह से जाना जाता है और लंबी अवधि के हो सकते हैं। विकिपीडिया पृष्ठ भी अच्छा सिफारिशों है:

एक सामान्य LCG की अवधि अधिक से अधिक मीटर है, और एक बहुत कम के कुछ विकल्पों के लिए है कि तुलना में । LCG एक पूर्ण अवधि यदि और केवल यदि होगा:

1. c and m are relatively prime, 
2. a - 1 is divisible by all prime factors of m, 
3. a - 1 is a multiple of 4 if m is a multiple of 4 
2

मानो या न मानो, मैं इस्तेमाल किया newx = oldx * 5 + 1 (या इसके थोड़ा अंतर) कई वीडियो गेम में। यादृच्छिकता भयानक है - यह एक यादृच्छिक जनरेटर की तुलना में एक scrambled अनुक्रम से अधिक है। लेकिन कभी-कभी आपको बस इतना ही चाहिए। अगर मैं सही ढंग से याद करता हूं, तो यह दोहराने से पहले सभी संख्याओं से गुजरता है।

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

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

+0

हे, यह एक दिलचस्प आरएनजी है, जो समझने के लिए सबसे गणितीय रूप से आसान है, मैंने निश्चित रूप से देखा है! मेरे पास इसके साथ एक खेल होगा, क्योंकि आप कहते हैं कि गति महत्वपूर्ण है। – Martin

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