2010-08-04 11 views
32

मैं उद्देश्य-सी में 0.15 और 0.3 के बीच एक यादृच्छिक फ्लोट बनाने की कोशिश कर रहा हूं। निम्नलिखित कोड हमेशा 1:उद्देश्य-सी में यादृच्छिक फ्लोट कैसे बनाएं?

int randn = (random() % 15)+15; 
float pscale = (float)randn/100; 

मैं क्या गलत कर रहा हूं?

+0

यह कोड काम करता प्रतीत होता है, फिर भी 100.0f का उपयोग करना बेहतर है। केवल वही मामला जो मुझे लगता है कि आप इस कोड को फ़ंक्शन में डाल रहे हैं और इसे .h में घोषित नहीं कर रहे हैं, इसलिए संकलक इसे डबल करने के लिए अपग्रेड कर सकता है। – chunkyguy

उत्तर

17

इस प्रयास करें:

(float)rand()/RAND_MAX 

या एक 0 5 के बीच और प्राप्त करने के लिए: एक ही बात करने के लिए

float randomNum = ((float)rand()/RAND_MAX) * 5; 
कई तरीके।

+19

यह गलत है। 'यादृच्छिक()/RAND_MAX' आपको एक फ़्लोटिंग-पॉइंट मान नहीं देगा क्योंकि न तो मान फ़्लोटिंग-पॉइंट है। साथ ही, 'यादृच्छिक() 'का डोमेन RAND_MAX पर 0 नहीं है। 'रैंड()' और 'rand_r()' का डोमेन है। इसलिए आपको अपेक्षित परिणाम प्राप्त करने के लिए '(फ्लोट) रैंड()/RAND_MAX' का उपयोग करना चाहिए। –

+1

यह गलत है (रैंड()/RAND_MAX) आपको शून्य देगा। जोनाथन की टिप्पणी सच है। – Gorky

+18

आप लोग जानते हैं कि आप जवाब संपादित कर सकते हैं, है ना? – hasen

4
  1. उपयोग arc4random() या बीज अपने यादृच्छिक मान
  2. कोशिश

    float pscale = ((float)randn)/100.0f; 
    
3

आपका कोड मेरे लिए काम करता है, यह 0.15 और 0.3 के बीच एक यादृच्छिक संख्या पैदा करता है (मैं के साथ बीज उपलब्ध कराए गए srandom())। क्या आपने random() पर पहली कॉल से पहले srandom() कहा है? आपको कुछ एंटरप्राइज़ वैल्यू के साथ srandom() प्रदान करने की आवश्यकता होगी (बहुत से लोग केवल srandom(time(NULL)) का उपयोग करते हैं)।

अधिक गंभीर यादृच्छिक संख्या पीढ़ी के लिए, arc4random पर एक नज़र डालें, जिसका उपयोग क्रिप्टोग्राफिक उद्देश्यों के लिए किया जाता है। यह यादृच्छिक संख्या फ़ंक्शन भी एक पूर्णांक प्रकार देता है, इसलिए आपको परिणाम को फ़्लोटिंग पॉइंट प्रकार पर डालने की आवश्यकता होगी।

63

यहाँ एक समारोह

- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber { 
float diff = bigNumber - smallNumber; 
return (((float) (arc4random() % ((unsigned)RAND_MAX + 1))/RAND_MAX) * diff) + smallNumber; 
} 
+13

#define boris_random (smallNumber, bigNumber) (((फ्लोट) (arc4random()% ((हस्ताक्षरित) RAND_MAX + 1))/RAND_MAX) * (bigNumber - smallNumber)) + छोटा नम्बर) – chunkyguy

+0

@chunkyguy, क्या आप कृपया पुनः लिख सकते हैं 'arc4random_uniform' का उपयोग करके यह उत्तर? –

0

srandom() और रैंड() जब आप कुछ नाव नमक के साथ सच randomizing की जरूरत है असुरक्षित है का उपयोग करना है।

मैक_10_7 पर, IPHONE_4_3 और उच्चतर आप arc4random_uniform (upper_bound) * का उपयोग कर सकते हैं। यह शून्य से * upper_bound * तक वास्तविक यादृच्छिक पूर्णांक उत्पन्न करने की अनुमति देता है।

तो आप निम्नलिखित

u_int32_t upper_bound = <some big enough integer>; 

float r = 0.3 * (0.5 + arc4random_uniform(upper_bound)*1.0/upper_bound/2); 
-5

कोशिश कर सकते हैं मैं वास्तविक पूर्णांक और फिर दशमलव के लिए एक पूर्णांक के लिए पूर्णांकों एक करने के लिए पैदा करने समाप्त हो गया। तब मैं उन्हें एक स्ट्रिंग में शामिल होने के तो मैं इसे "floatValue" समारोह के साथ एक floatvalue को पार्स ... मैं एक बेहतर तरीका नहीं पा सके और यह मेरा इरादों के लिए काम करता है, आशा है कि यह मदद करता है :)

int integervalue = arc4random() % 2; 
int decimalvalue = arc4random() % 9; 
NSString *floatString = [NSString stringWithFormat:@"%d.%d",integervalue,decimalvalue]; 
float randomFloat = [floatString floatValue]; 
+1

यह एक साधारण चीज करने के लिए एक अद्भुत तरीके से घुलनशील तरीका है, और यह भी सही नहीं है। (उदाहरण के लिए, यह कभी भी '1.01' उत्पन्न नहीं कर सकता।) –

2

सबसे आसान।

+ (float)randomNumberBetween:(float)min maxNumber:(float)max 
{ 
    return min + arc4random_uniform(max - min + 1); 
} 
+1

' arc4random_uniform' यादृच्छिक पूर्णांक उत्पन्न करता है। – Andy

0

@ Caladain के जवाब देने के लिए जोड़ने के लिए, यदि आप समाधान rand() के रूप में उपयोग करने के लिए के रूप में आसान होना चाहते हैं, तो आप को परिभाषित कर सकते इन:

#define randf() ((CGFloat)rand()/RAND_MAX) 
#define randf_scaled(scale) (((CGFloat)rand()/RAND_MAX) * scale) 

double साथ CGFloat को बदलने के लिए स्वतंत्र महसूस अगर आप डॉन कोरग्राफिक्स तक पहुंच नहीं है।

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