2010-05-26 31 views
5

मैं उद्देश्य-सी में एक यादृच्छिक रंग हेक्साडेसिमल कैसे उत्पन्न करूं?उद्देश्य-सी में यादृच्छिक रंग हेक्स उत्पन्न करें?

मुझे रंग हेक्साडेसिमल की आवश्यकता है, मुझे यादृच्छिक रंग की आवश्यकता नहीं है। यह जटिल है ...

+2

यूआईसीओलर/एनएससीओलर या '# abcdef' स्ट्रिंग? – kennytm

+0

मुझे यादृच्छिक रंग की आवश्यकता नहीं है, लेकिन मुझे वास्तव में एक रंग हेक्स की आवश्यकता है (जिसका उद्देश्य इसका उपयोग रंग से संबंधित नहीं है)। –

उत्तर

18

मुझे लगता है कि आपके लिए काम करना चाहिए। Arc4random() प्रदर्शन & के प्रदर्शन में कहीं बेहतर है ... रैंड() से सटीकता। रैंड() को उपयोग से पहले बीजित करने की भी आवश्यकता है।

// 16777215 is FFFFFF 
NSInteger *baseInt = arc4random() % 16777216; 
NSString *hex = [NSString stringWithFormat:@"%06X", baseInt]; 

संपादित करें: स्वरूपण के संबंध में टिप्पणी के आधार पर संपादित करें।

+0

आपको बहुत धन्यवाद –

+1

लगभग सही है, लेकिन आपको '% 06X' की आवश्यकता है, अन्यथा आपको' # AB' जैसे रंग मिलेंगे। – kennytm

+1

स्ट्रिंग को प्रारूपित करें क्योंकि आपको # या नहीं शामिल करने की आवश्यकता है। –

5

आप मानक सी का उपयोग कर सकते आपके उद्देश्य-सी अनुप्रयोग में लाइब्रेरी दिनचर्या rand()। वहां से, आप अपने यादृच्छिक रंग के लाल, हरे और नीले चैनलों में से प्रत्येक के लिए यादृच्छिक मान प्राप्त करने के लिए इसे तीन बार कॉल करना चाहेंगे। आप मानक (%) मान को अधिकतम मूल्य से मान सकते हैं, आमतौर पर 256. वहां से आप अपना NSColor उचित रूप से बना सकते हैं। तो अपने कोड कुछ लग सकता है जैसे:

int red = rand() % 255; 
int green = rand() % 255; 
int blue = rand() % 255; 
NSColor* myColor = [NSColor colorWithCalibratedRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1.0]; 

क्योंकि NSColor पूर्णांकों के बजाय तैरता लेता है एक बेहतर दृष्टिकोण शुरू से ही RAND_MAX से यादृच्छिक मान विभाजित करने के लिए किया जाएगा:

float rand_max = RAND_MAX; 
float red = rand()/rand_max; 
float green = rand()/rand_max; 
float blue = rand()/rand_max; 
NSColor* myColor = [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:1.0]; 

यह बाद कोड होगा 24-बिट स्पेक्ट्रम में रंगों की संख्या सीमित न करें।

+0

हाँ, लेकिन फिर आपके पास केवल आरजीबी मान होंगे - यह हेक्साडेसिमल मानों में परिवर्तित नहीं होता है और इसे संयोजित किया जाता है (इसे हेक्साडेसिमल रंग कोड बनाते हैं), जिसे ओपी को स्पष्ट रूप से इसकी आवश्यकता होती है। –

+0

हाँ; मैंने अपना जवाब पोस्ट करने से पहले स्पष्ट किया कि वह क्या देख रहा था। – fbrereto

+0

यादृच्छिक() नहीं रैंड() का प्रयोग करें। रैंड() के कम 12 बिट्स चक्रीय पैटर्न के माध्यम से जाते हैं। इसके अलावा, 'रैंड()% 255' आपको 0 - 254 रेंज में एक नंबर देता है। – JeremyP

0
बस एक छोटी टिप्पणी के लिए

:

अपनी आवश्यकताओं पर निर्भर करता है, तो संभव है कि आप एक नहीं तो यादृच्छिक रंग जनरेटर लिखने के लिए विचार करना चाहिए। (उदाहरण के लिए जब जेनरेट किए गए रंगों की दृश्यता के लिए "नियम" सेट अप करना चाहते हैं।) तो यह संभव है कि आपको एचएसबी में यादृच्छिक-जेनरेट किए गए मानों को सीमित करके रंग कोड प्राप्त करने की आवश्यकता हो।

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