На некоторых системах (в настоящее время Windows с VC наводит на мысль,] RAND_MAX
смехотворно мала, i. е. всего 15 бит. При делении на RAND_MAX
вы генерируете мантиссону из 15 бит вместо 23 возможных бит. Это может быть или не быть проблемой для вас, но в этом случае вы упускаете некоторые значения.
О, только что заметил, что для этой проблемы уже есть комментарий. В любом случае, вот какой код, который может решить это для вас:
float r = (float)((rand() << 15 + rand()) & ((1 << 24) - 1)) / (1 << 24);
Не проиндексирован, но может работать: -)