How to generate random float number in C
我找不到任何解决方案来生成
我已经尝试了以下方法,但是它似乎无法正常工作。
1 |
尝试:
1 |
要了解其工作原理,请考虑以下内容。
1 | N = a random value in [0..RAND_MAX] inclusively. |
上面的公式(为清楚起见,删除了演员表)变为:
1 | N/(RAND_MAX/a) |
但是,除以分数等于将其乘以该分数的倒数,因此等于:
1 | N * (a/RAND_MAX) |
可以重写为:
1 | a * (N/RAND_MAX) |
考虑到
另外,您可以使用以下代码,它可以有效地执行我在上面显示的细分。我实际上更喜欢这样做仅仅是因为它更清楚了实际发生的事情(无论如何对我来说):
1 |
注意:
样品
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
输出量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
您还可以在[min,max]范围内生成类似
1 2 3 4 5 | float float_rand( float min, float max ) { float scale = rand() / (float) RAND_MAX; /* [0, 1.0] */ return min + scale * ( max - min ); /* [min, max] */ } |
如果要生成某个范围内的随机浮点,请尝试下一个解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #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 ", data[i][0], random_float(data[i][0], data[i][1]), data[i][1]); } puts(line); return 0; } |
结果(值多变)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ------------------------------------------- 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 ------------------------------------------- |