我找不到解决方案,从中找到随机浮点数[0,a],其中a是用户定义的浮点数.
我尝试了以下内容,但它似乎无法正常工作.
float x=(float)rand()/((float)RAND_MAX/a)
Run Code Online (Sandbox Code Playgroud)
Who*_*aig 54
尝试:
float x = (float)rand()/(float)(RAND_MAX/a);
Run Code Online (Sandbox Code Playgroud)
要了解其工作原理,请考虑以下事项.
N = a random value in [0..RAND_MAX] inclusively.
Run Code Online (Sandbox Code Playgroud)
上面的等式(为清晰起见,删除模型)变为:
N/(RAND_MAX/a)
Run Code Online (Sandbox Code Playgroud)
但除以一个分数相当于乘以所述分数的倒数,所以这相当于:
N * (a/RAND_MAX)
Run Code Online (Sandbox Code Playgroud)
可以改写为:
a * (N/RAND_MAX)
Run Code Online (Sandbox Code Playgroud)
考虑N/RAND_MAX始终是介于0.0和1.0之间的浮点值,这将生成介于0.0和0.0之间的值a.
或者,您可以使用以下内容,这有效地完成了我在上面显示的细分.我实际上更喜欢这个,因为它更清楚实际发生的事情(无论如何):
float x = ((float)rand()/(float)(RAND_MAX)) * a;
Run Code Online (Sandbox Code Playgroud)
注意:浮点表示a必须是精确的,否则永远不会达到你的绝对边缘情况a(它会接近).有关原因的详细信息,请参阅此文章.
样品
#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;
}
Run Code Online (Sandbox Code Playgroud)
产量
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
Run Code Online (Sandbox Code Playgroud)
baz*_*baz 10
您还可以在[min,max]范围内生成类似的内容
float float_rand( float min, float max )
{
float scale = rand() / (float) RAND_MAX; /* [0, 1.0] */
return min + scale * ( max - min ); /* [min, max] */
}
Run Code Online (Sandbox Code Playgroud)