2012-11-16 17 views
21

संभव डुप्लिकेट यादृच्छिक नाव संख्या उत्पन्न करने के:
C++ random float
How to generate a random number in C?कैसे सी में

मैं [0,a], जहां a से यादृच्छिक नाव नंबर मिल का हल नहीं मिल सकता है उपयोगकर्ता द्वारा परिभाषित कुछ फ्लोट है।

मैंने निम्नलिखित की कोशिश की है, लेकिन यह सही ढंग से काम नहीं कर रहा है।

float x=(float)rand()/((float)RAND_MAX/a) 
+1

जैसे http में एक सीमा [मिनट, अधिकतम] कुछ के साथ उत्पन्न कर सकते हैं: // ग faq.com/lib/randrange.html – Ouadie

+2

और निश्चित रूप से, https://www.google.com/search?q=How+to+generate+random+float+number+in+C – rid

+0

धन्यवाद। यह होना चाहिए: फ्लोट एक्स = (फ्लोट) रैंड()/((फ्लोट) आरएND_MAX/ए) या फ्लोट एक्स = (फ्लोट) रैंड()/((फ्लोट) आरएND_MAX/ए + 1)? – fragon

उत्तर

39

प्रयास करें:

float x = (float)rand()/(float)(RAND_MAX/a); 

को समझने के लिए कि यह कैसे काम करता है निम्नलिखित पर विचार करें।

N = a random value in [0..RAND_MAX] inclusively. 

उपरोक्त समीकरण (स्पष्टता के लिए डाले को हटाने) हो जाता है:

N/(RAND_MAX/a) 

लेकिन एक अंश से विभाजन से गुणा के बराबर कहा अंश के पारस्परिक है, इसलिए इस के बराबर है:

N * (a/RAND_MAX) 

जो के रूप में लिखा जा सकता है:

a * (N/RAND_MAX) 

N/RAND_MAX को ध्यान में रखते हुए 0.0 और 1.0 के बीच हमेशा एक फ़्लोटिंग पॉइंट मान होता है, इससे 0.0 और a के बीच एक मूल्य उत्पन्न होगा।

वैकल्पिक रूप से, आप निम्न का उपयोग कर सकते हैं, जो ऊपर दिखाए गए ब्रेकडाउन को प्रभावी ढंग से करता है। मैं वास्तव में यह केवल पसंद करते हैं क्योंकि यह स्पष्ट क्या वास्तव में हो रहा है है (मेरे लिए, वैसे भी):

float x = ((float)rand()/(float)(RAND_MAX)) * a; 

नोट: a की चल बिन्दु प्रतिनिधित्व सटीक होना चाहिए या इस हिट कभी नहीं होगा अपने पूर्ण बढ़त मामले a (यह करीब हो जाएगा)। क्यों के बारे में किरदार विवरण के लिए this article देखें।

नमूना

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    srand((unsigned int)time(NULL)); 

    float a = 5.0; 
    for (int i=0;i<20;i++) 
     printf("%f\n", ((float)rand()/(float)(RAND_MAX)) * a); 
    return 0; 
} 

आउटपुट

1.625741 
3.832026 
4.853078 
0.687247 
0.568085 
2.810053 
3.561830 
3.674827 
2.814782 
3.047727 
3.154944 
0.141873 
4.464814 
0.124696 
0.766487 
2.349450 
2.201889 
2.148071 
2.624953 
2.578719 
+6

यह वास्तव में खराब हो सकता है गोल गुण। रैंड() एक 32-बिट int देता है, जिसे आप 32-बिट फ्लोट पर कास्टिंग कर रहे हैं, जिससे मूल्यों को मापने का कारण बन जाएगा। उदाहरण के लिए, यह 64 गुना अधिक संभावना है कि आपको मूल्य 100 से 1000000192 मूल्य मिलेगा, 1000000161 से 1000000223 के माध्यम से 1000000192 तक। आप इसे डबल से कास्ट करके, अंत में एक फ्लोट पर कास्टिंग करके इससे बच सकते हैं : फ्लोट ((डबल) रैंड()/(डबल) (आरएND_MAX/ए))। –

-1

आप एक श्रेणी में एक यादृच्छिक नाव उत्पन्न करने के लिए चाहते हैं, एक अगले समाधान का प्रयास करें।

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 


float 
random_float(const float min, const float max) 
{ 
    if (max == min) return min; 
    else if (min < max) return (max - min) * ((float)rand()/RAND_MAX) + min; 

    // return 0 if min > max 
    return 0; 
} 


int 
main (const int argc, const char *argv[]) 
{ 
    srand(time(NULL)); 

    char line[] = "-------------------------------------------"; 

    float data[10][2] = { 
     {-10, 10}, 
     {-5., 5}, 
     {-1, 1}, 
     {-0.25, -0.15}, 
     {1.5, 1.52}, 
     {-1700, 8000}, 
     {-0.1, 0.1}, 
     {-1, 0}, 
     {-1, -2}, 
     {1.2, 1.1} 
    }; 

    puts(line); 
    puts("  From | Result |  To"); 
    puts(line); 


    int i; 
    for (i = 0; i < 10; ++i) { 
     printf("%12f | %12f | %12f\n", data[i][0], random_float(data[i][0], data[i][1]), data[i][1]); 
    } 

    puts(line); 

    return 0; 
} 

एक परिणाम (मान चंचल है)

------------------------------------------- 
    From | Result |  To 
------------------------------------------- 
    -10.000000 |  2.330828 | 10.000000 
    -5.000000 | -4.945523 |  5.000000 
    -1.000000 |  0.004242 |  1.000000 
    -0.250000 | -0.203197 | -0.150000 
    1.500000 |  1.513431 |  1.520000 
-1700.000000 | 3292.941895 | 8000.000000 
    -0.100000 | -0.021541 |  0.100000 
    -1.000000 | -0.148299 |  0.000000 
    -1.000000 |  0.000000 | -2.000000 
    1.200000 |  0.000000 |  1.100000 
------------------------------------------- 
3

तुम भी

float float_rand(float min, float max) 
{ 
    float scale = rand()/(float) RAND_MAX; /* [0, 1.0] */ 
    return min + scale * (max - min);  /* [min, max] */ 
}