2012-11-16 34 views
21

可能重複:
C++ random float
How to generate a random number in C?如何生成用C隨機浮點數

我無法找到解決方案,找到從[0,a],其中a隨機浮點數是用戶定義的一些浮點數。

我試過以下,但它似乎並沒有正常工作。

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

HTTP:// C- faq.com/lib/randrange.html – Ouadie

+2

當然,https://www.google.com/search?q=How+to+generate+random+float+number+in+C – rid

+0

謝謝。應該是: float x =(float)rand()/((float)RAND_MAX/a)或 float x =(float)rand()/((float)RAND_MAX/a + 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

這可能真的很糟糕舍入屬性。 rand()返回一個32位的int值,您將轉換爲32位的float值,這會導致值被量化。例如,從1000000161到1000000223到1000000192,您獲得值1000000192的可能性比值爲1的可能性高64倍。您可以通過將其轉換爲double來避免這種情況,然後將其轉換爲最終的float值:float((double)rand()/(double)(RAND_MAX/a))。 –

-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] */ 
}