用C语言生成[0,1)之间的随机浮点数

阅读量: searchstar 2020-07-19 20:36:42
Categories: Tags:

参考:
如何用C语言生成(0,1)之间的随机浮点数? - Milo Yip的回答 - 知乎
https://www.zhihu.com/question/25037345/answer/29879012

#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\n", RAND_MAX);
	for (int i = 0; i < 10; ++i) {
		printf("%f\n", 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(),反正原理都是一样的。