Prova:
float x = (float)rand()/(float)(RAND_MAX/a);
Per capire come funziona questo considerare quanto segue.
N = a random value in [0..RAND_MAX] inclusively.
L'equazione di cui sopra (rimuovendo i stampi per chiarezza) diventa:
N/(RAND_MAX/a)
Ma divisione per una frazione equivale a moltiplicare per detto di frazione reciproco, quindi questo è equivalente a:
N * (a/RAND_MAX)
che può essere riscritta come:
a * (N/RAND_MAX)
Considerando N/RAND_MAX
è sempre un valore in virgola mobile compreso tra 0.0 e 1.0, questo genererà un valore compreso tra 0.0 e a
.
In alternativa, è possibile utilizzare quanto segue, che fa effettivamente la suddivisione che ho mostrato sopra. Io in realtà preferisco questo semplicemente perché è più chiaro ciò che sta realmente accadendo (per me, comunque):
float x = ((float)rand()/(float)(RAND_MAX)) * a;
Nota: la rappresentazione in virgola mobile di a
deve essere esatto o questo non potrà mai colpire il caso limite assoluto di a
(si avvicinerà). Vedi this article per i dettagli grintosi sul perché.
Esempio
#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;
}
uscita
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
http: // c- faq.com/lib/randrange.html – Ouadie
E, naturalmente, https://www.google.com/search?q=How+to+generate+random+float+number+in+C – rid
Grazie. Dovrebbe essere: float x = (float) rand()/((float) RAND_MAX/a) o float x = (float) rand()/((float) RAND_MAX/a + 1)? – fragon