用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(),反正原理都是一样的。

经验分享 程序员 微信小程序 职场和发展