用C语言生成[0,1)之间的随机浮点数
参考: 如何用C语言生成(0,1)之间的随机浮点数? - Milo Yip的回答 - 知乎
#if RAND_MAX == 0x7fffffff
// Return [0, 1)
float randf() {
int r = (rand() >> 8) | 0x3f800000;;
return *(float *)&r - 1;
}
#else
#error Error: RAND_MAX != 0x7fffffff.
#endif
double同理。
注意这里因为RAND_MAX的最高位是0,所以只需要右移8位就可以腾出9位给符号位和阶码了。
测试:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#if RAND_MAX == 0x7fffffff
// Return [0, 1)
float randf() {
int r = (rand() >> 8) | 0x3f800000;;
return *(float *)&r - 1;
}
#else
#error Error: RAND_MAX != 0x7fffffff.
#endif
int main() {
srand(time(NULL));
printf("%d
", RAND_MAX);
for (int i = 0; i < 10; ++i) {
printf("%f
", randf());
}
return 0;
}
输出:
2147483647 0.926574 0.300805 0.337950 0.574079 0.370166 0.259473 0.873635 0.062161 0.585904 0.005816
以上例程只能在Linux上运行,不能在windows上运行,因为windows的RAND_MAX是0x7FFF。如果需要在windows上运行,可以自己写一个(或者找一个)生成31位随机数的函数取代rand(),反正原理都是一样的。
