मैं शुरू में एक ही जवाब देने जा रहा था क्योंकि बाकी सभी के पास था और मुद्दों के साथ इसको चाक कर दिया rand()
। हालाँकि, मैंने ऐसा करना बेहतर समझा और इसके बजाय वितरण का विश्लेषण किया कि आपका गणित वास्तव में उत्पादन कर रहा है।
TL; DR: आपके द्वारा देखा जाने वाला पैटर्न अंतर्निहित रैंडम नंबर जनरेटर से कोई लेना-देना नहीं है और इसके बजाय बस इस तरह से है कि आपका प्रोग्राम संख्याओं में हेरफेर कर रहा है।
मैं आपके नीले फंक्शन से चिपके रहूँगा क्योंकि वे सभी समान हैं।
uint8_t blue(uint32_t x, uint32_t y) {
return (rand() % 2) ? (x + y) % rand() :
((x * y % 1024) % rand()) % 2 ? (x - y) % rand() :
rand();
}
प्रत्येक पिक्सेल मूल्य तीन कार्यों में से एक से चयन किया जाता है: (x + y) % rand()
, (x - y) % rand()
, और rand()
;
आइए, इनमें से प्रत्येक द्वारा निर्मित छवियों को देखें।
यह वही है जो आप उम्मीद करेंगे, बस शोर। इस "छवि सी" को कॉल करें
यहां आप एक साथ पिक्सेल निर्देशांक जोड़ रहे हैं और एक यादृच्छिक संख्या से विभाजित करके शेष ले रहे हैं। यदि छवि 1024x1024 है, तो योग सीमा [0-2046] में है। आप जिस यादृच्छिक संख्या से डाइविंग कर रहे हैं वह [0, RAND_MAX] श्रेणी में है, जहाँ RAND_MAX कम से कम 32k है और कुछ प्रणालियों पर 2 बिलियन है। दूसरे शब्दों में, 16 में से 1 में सबसे अच्छा मौका है जो शेष नहीं है (x + y)
। इसलिए अधिकांश भाग के लिए यह फ़ंक्शन सिर्फ + x + y दिशा की ओर नीले रंग की वृद्धि का एक ग्रेडिएंट पैदा करेगा।
हालाँकि, आप केवल सबसे कम 8 बिट्स का उपयोग कर रहे हैं, क्योंकि आप ए वापस करते हैं uint8_t
, इसलिए आपके पास 256 पिक्सेल चौड़े ग्रेडिएंट्स की धारियाँ होंगी।
इस "छवि A" को कॉल करें
यहां आप कुछ ऐसा ही करते हैं, लेकिन घटाव के साथ। जब तक x y से अधिक है, तो आपके पास पिछली छवि के समान कुछ होगा। लेकिन जहां y अधिक है, परिणाम बहुत बड़ी संख्या है क्योंकि x
और y
अहस्ताक्षरित हैं (नकारात्मक परिणाम अहस्ताक्षरित प्रकार की सीमा के शीर्ष के चारों ओर लपेटते हैं), और फिर % rand()
kicks में और आप वास्तव में शोर करते हैं।
इस "छवि बी" को कॉल करें
आपकी अंतिम छवि में प्रत्येक पिक्सेल इन तीन छवियों में से एक फ़ंक्शन से लिया गया है rand() % 2
और ((x * y % 1024) % rand()) % 2
। इनमें से पहले को 50% प्रायिकता (मुद्दों के साथ rand()
और इसके निम्न क्रम बिट्स की अनदेखी) के साथ पढ़ा जा सकता है ।
यहां एक क्लोजअप है जहां rand() % 2
सच है (सफेद पिक्सेल) इसलिए छवि ए का चयन किया गया है।
दूसरे फ़ंक्शन में एक ((x * y % 1024) % rand()) % 2
बार फिर यह मुद्दा है कि rand()
आमतौर पर आप जिस चीज़ को विभाजित कर रहे हैं, उससे अधिक है (x * y % 1024)
, जो कि 1023 पर है। तब (x*y%1024)%2
0 और 1 समान रूप से उत्पन्न नहीं होता है। किसी भी विषम संख्या को किसी सम संख्या से गुणा किया जाता है। किसी भी संख्या को किसी सम संख्या से गुणा करने पर भी सम संख्या होती है। केवल एक विषम संख्या से गुणा एक विषम संख्या विषम है, और इसलिए %2
उन मूल्यों पर भी जो उस समय के तीन चौथाई हैं, समय के 0 तीन चौथाई का उत्पादन करेंगे।
यहाँ एक क्लोज़अप है जहाँ ((x * y % 1024) % rand()) % 2
सच है ताकि Image B को चुना जा सके। यह ठीक वही है जहाँ दोनों निर्देशांक विषम हैं।
और यहाँ जहाँ छवि C का चयन किया जा सकता है:
अंत में यहाँ की स्थितियों को मिलाकर जहाँ चित्र B को चुना गया है:
और जहां छवि C का चयन किया गया है:
परिणामी संयोजन को इस प्रकार पढ़ा जा सकता है:
50% संभावना के साथ छवि ए से पिक्सेल का उपयोग करें। बाकी समय छवि बी और छवि सी, बी के बीच चुनें जहां दोनों निर्देशांक विषम हैं, सी जहां या तो एक भी है।
अंत में, चूंकि आप तीन अलग-अलग रंगों के लिए एक ही कर रहे हैं, लेकिन विभिन्न झुकावों के साथ पैटर्न प्रत्येक रंग में अलग-अलग उन्मुख होते हैं और आपके द्वारा देखे जा रहे क्रॉसिंग स्ट्रिप्स या ग्रिड पैटर्न का उत्पादन करते हैं।