c - 如何在C中生成随机 float

标签 c random floating-point

我找不到任何解决方案来生成[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/

相关文章:

haskell - 我可以期望使用 System.Random 的结果在所有系统上都可重现吗?

java - 可以在没有数组或循环的情况下简化此随机代码吗?

java - 是否有一个随机函数可以返回所选类型的值?

python - 如何在 python 中将数字转换为 12 位精度?

php - 带有命令行参数的 C 控制台应用程序中的井号 (#)

c - read() 返回 "incorrect"值

c - 在c中做while循环条件

c - 截图程序无法运行

java - 西塔有什么作用?

delphi - Trunc() 函数