我找不到任何解决方案来生成[0,a]范围内的随机浮点数,其中a是用户定义的某个浮点数。我尝试了以下方法,但似乎无法正常工作。
[0,a]
a
float x=(float)rand()/((float)RAND_MAX/a)
mzmfm0qo1#
试试看:
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之间的值。或者,你可以使用下面的方法,它可以有效地完成我上面展示的分解。我实际上更喜欢这个方法,只是因为它更清楚实际发生的事情(对我来说,无论如何):
N/RAND_MAX
float x = ((float)rand()/(float)(RAND_MAX)) * a;
注意:a的浮点表示必须是 exact 的,否则它永远不会达到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; }
输出
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
iyfjxgzm2#
您还可以使用类似于以下内容的值在[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] */ }
vi4fp9gy3#
虽然现在可能不重要,但这里有一个函数,它在2个值之间生成浮点数。
#include <math.h> float func_Uniform(float left, float right) { float randomNumber = sin(rand() * rand()); return left + (right - left) * fabs(randomNumber); }
jw5wzhpr4#
如果要在某个范围内生成随机浮点数,请尝试下一个解决方案。
#include <stdio.h> #include <stdlib.h> #include <time.h> float random_float(const float min, const float max) { if (max == min) return min; else if (min < max) return (max - min) * ((float)rand() / RAND_MAX) + min; // return 0 if min > max return 0; } int main (const int argc, const char *argv[]) { srand(time(NULL)); char line[] = "-------------------------------------------"; float data[10][2] = { {-10, 10}, {-5., 5}, {-1, 1}, {-0.25, -0.15}, {1.5, 1.52}, {-1700, 8000}, {-0.1, 0.1}, {-1, 0}, {-1, -2}, {1.2, 1.1} }; puts(line); puts(" From | Result | To"); puts(line); int i; for (i = 0; i < 10; ++i) { printf("%12f | %12f | %12f\n", data[i][0], random_float(data[i][0], data[i][1]), data[i][1]); } puts(line); return 0; }
结果(价值观变化无常)
------------------------------------------- From | Result | To ------------------------------------------- -10.000000 | 2.330828 | 10.000000 -5.000000 | -4.945523 | 5.000000 -1.000000 | 0.004242 | 1.000000 -0.250000 | -0.203197 | -0.150000 1.500000 | 1.513431 | 1.520000 -1700.000000 | 3292.941895 | 8000.000000 -0.100000 | -0.021541 | 0.100000 -1.000000 | -0.148299 | 0.000000 -1.000000 | 0.000000 | -2.000000 1.200000 | 0.000000 | 1.100000 -------------------------------------------
42fyovps5#
这会在两个浮点数之间生成一个随机浮点数。
float RandomFloat(float min, float max){ return ((max - min) * ((float)rand() / RAND_MAX)) + min; }
ykejflvf6#
也许也是这样:a=转换为双精度兰德数下一个(-1000,1000))/100;所以我们可以把数字从-10,00变成10,00。
6条答案
按热度按时间mzmfm0qo1#
试试看:
要理解这是如何工作的,请考虑以下内容。
上面的等式(为清楚起见,去掉了模型)变为:
但是除以一个分数就等于乘以该分数的倒数,所以这就等于:
其可以被重写为:
考虑到
N/RAND_MAX
始终是0.0和1.0之间的浮点值,这将生成0.0和a
之间的值。或者,你可以使用下面的方法,它可以有效地完成我上面展示的分解。我实际上更喜欢这个方法,只是因为它更清楚实际发生的事情(对我来说,无论如何):
注意:
a
的浮点表示必须是 exact 的,否则它永远不会达到a
的绝对边缘情况(它会变得很接近)。样品
输出
iyfjxgzm2#
您还可以使用类似于以下内容的值在[min,max]范围内生成
vi4fp9gy3#
虽然现在可能不重要,但这里有一个函数,它在2个值之间生成浮点数。
jw5wzhpr4#
如果要在某个范围内生成随机浮点数,请尝试下一个解决方案。
结果(价值观变化无常)
42fyovps5#
这会在两个浮点数之间生成一个随机浮点数。
ykejflvf6#
也许也是这样:a=转换为双精度兰德数下一个(-1000,1000))/100;所以我们可以把数字从-10,00变成10,00。