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
http: // C- faq.com/lib/randrange.html – Ouadie
Oczywiście, https://www.google.com/search?q=How+do wygenerowania +random+float+number+w+C – rid
Dzięki. Powinno to być: float x = (float) rand()/((float) RAND_MAX/a) lub float x = (float) rand()/((float) RAND_MAX/a + 1)? – fragon