如何将rand()结果设置为某个范围内的值,包括底片?

时间:2013-05-07 02:04:44

标签: c random max min

我正在尝试动态分配一个双精度数组,并将每个元素设置为正数或负数范围内的随机值,但我遇到了困难。

现在,我只能弄清楚如何设置数字0 - 最大。

这是我到目前为止所做的:

double *random_arr(int size, double min, double max) {
    double *array0 = calloc(size, sizeof(double));
    if (array0 == NULL) {
            exit(1);
    }
    for (int i = 0; i < size; i++)
            array0[i] = (max * rand() / RAND_MAX);
    return array0;
}

我最好的猜测:

for (int i = 0; i < size; i++)
    array0[i]=((max + min) * rand() / RAND_MAX) - min;

2 个答案:

答案 0 :(得分:4)

范围应为(最大 - 最小),您可以预先计算乘以RAND_MAX的倍增系数。

double factor = (max - min) / RAND_MAX;
for (int i = 0; i < size; i++)
    array0[i] = (rand() * factor) + min;

答案 1 :(得分:1)

假设rand()返回浮点数0&lt; = x&lt; 1,您只需要按所需数字的范围进行缩放,然后再加上最小值。

示例:我们希望数字从-100到-10

你的范围是你的最大 - 最小值,即-10 - (-100)= 90

假设您的随机数为0.5

0.5 * 90 + -100(您的最低要求)= -55

让我们检查边缘情况:

随机数= 0.0

0.0 * 90 + -100 = -100

随机数= 0.9999999999 ......

0.99999999 ... * 90 + -100 = -10

大!