Cómo generar un número de flotación aleatorio en C

No encuentro la solución para encontrar el número de flotación aleatorio del [0,a] , donde a es un flotación definido por el usuario.

He intentado lo siguiente, pero parece que no funciona correctamente.

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

Tratar:

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

Para entender cómo funciona esto, considere lo siguiente.

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

La ecuación anterior (eliminar los moldes para mayor claridad) se convierte en:

 N/(RAND_MAX/a) 

Pero dividir por una fracción es el equivalente a multiplicar por el recíproco de dicha fracción, por lo que esto es equivalente a:

 N * (a/RAND_MAX) 

que puede ser reescrito como:

 a * (N/RAND_MAX) 

Teniendo en cuenta que N/RAND_MAX siempre es un valor de punto flotante entre 0.0 y 1.0, esto generará un valor entre 0.0 y a .

Alternativamente, puede usar lo siguiente, que efectivamente hace el desglose que mostré arriba. Realmente prefiero esto simplemente porque está más claro lo que realmente está pasando (para mí, de todos modos):

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

Nota: la representación en coma flotante de a debe ser exacta o nunca llegará a su caso de borde absoluto de a (se acercará). Vea este artículo para conocer los detalles sobre por qué.

Muestra

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

Salida

 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 

También puedes generar en un rango [min, max] con algo como

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

Si desea generar un flotante aleatorio en un rango, intente una próxima solución.

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

Un resultado (los valores son caprichosos)

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