我找不到任何解决方案来生成[0,a]
范围内的随机 float ,其中a
是用户定义的 float 。
我尝试了以下方法,但似乎无法正常工作。
float x=(float)rand()/((float)RAND_MAX/a)
最佳答案
尝试:
float x = (float)rand()/(float)(RAND_MAX/a);
要了解其工作原理,请考虑以下内容。
N = a random value in [0..RAND_MAX] inclusively.
上面的等式(为了清晰起见,删除了强制类型转换)变为:
N/(RAND_MAX/a)
但是除以一个分数相当于乘以该分数的倒数,所以这相当于:
N * (a/RAND_MAX)
可以重写为:
a * (N/RAND_MAX)
考虑到 N/RAND_MAX
始终是 0.0 和 1.0 之间的浮点值,这将生成一个介于 0.0 和 a
之间的值。
或者,您可以使用以下内容,它可以有效地完成我上面显示的 segmentation 。我实际上更喜欢这个,因为它更清楚实际发生的事情(无论如何对我来说):
float x = ((float)rand()/(float)(RAND_MAX)) * a;
注意:a
的浮点表示必须精确,否则永远不会遇到 a
的绝对边缘情况(它将得到关闭)。请参阅this article了解有关原因的详细信息。
示例
#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;
}
输出
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
关于c - 如何在C中生成随机 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33447992/