2012-11-16 12 views
21

Powiel możliwe:
C++ random float
How to generate a random number in C?Jak wygenerować losową liczbę typu float w C

nie mogę znaleźć rozwiązania, aby znaleźć losową liczbę zmiennoprzecinkową z [0,a], gdzie a to pewien float zdefiniowany przez użytkownika.

Próbowałem następujące, ale nie wydaje się działać poprawnie.

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

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

+2

Oczywiście, https://www.google.com/search?q=How+do wygenerowania +random+float+number+w+C – rid

+0

Dzięki. Powinno to być: float x = (float) rand()/((float) RAND_MAX/a) lub float x = (float) rand()/((float) RAND_MAX/a + 1)? – fragon

Odpowiedz

39

Spróbuj:

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

Aby zrozumieć, jak to działa rozważyć następujące.

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

Powyższe równanie (usuwanie odlewy klarowności) przedstawia się następująco:

N/(RAND_MAX/a) 

jednak podział przez ułamek jest równoważne pomnożenie przez zwrotnej frakcji użytkownika, więc jest równoważna:

N * (a/RAND_MAX) 

które mogą być zapisane jako:

a * (N/RAND_MAX) 

Rozważając N/RAND_MAX jest zawsze wartością zmiennoprzecinkową z zakresu od 0,0 do 1,0, wygeneruje ona wartość między 0,0 a a.

Alternatywnie, możesz użyć następującego, który efektywnie pokazuje podział pokazany powyżej. I rzeczywiście wolą to tylko dlatego, że jest jaśniejszy, co się rzeczywiście dzieje (dla mnie w każdym razie):

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

Uwaga: zmiennoprzecinkowych reprezentacji a musi być dokładny czy to nigdy nie trafi swój absolutny przypadek krawędzi z a (będzie blisko). Zobacz this article, aby uzyskać szczegółowe informacje na temat tego, dlaczego.

Próbka

#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; 
} 

Wyjście

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

To może naprawdę źle właściwości zaokrąglania. Rand() zwraca 32-bitową int, którą przesyłasz do 32-bitowego float, co spowoduje kwantyzację wartości. Na przykład, jest 64 razy bardziej prawdopodobne, że otrzymasz wartość 1000000192 niż wartość 1, od 1000000161 do 1000000223 przez cały czas do 1000000192. Możesz tego uniknąć, rzucając na double, a następnie spuszczając na końcu float : float ((double) rand()/(double) (RAND_MAX/a)). –

-1

Jeśli chcesz wygenerować losowy pływak w zakresie, spróbuj następnego rozwiązania.

#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; 
} 

Wynik (wartości jest zmienny)

------------------------------------------- 
    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

można również uzyskać w zakresie [min, X, max] z czymś

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