Подтвердить что ты не робот

Как создать случайное число с плавающей точкой в ​​C

Возможный дубликат:
С++ random float
Как сгенерировать случайное число в C?

Я не могу найти решение, чтобы найти случайное число с плавающей точкой из [0,a], где a - некоторый float, определенный пользователем.

Я пробовал следующее, но, похоже, он работает неправильно.

float x=(float)rand()/((float)RAND_MAX/a)
4b9b3361

Ответ 1

Try:

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.

В качестве альтернативы вы можете использовать следующее, которое эффективно показывает разбивку, показанную выше. Я на самом деле предпочитаю это просто потому, что ясно, что на самом деле происходит (для меня, во всяком случае):

float x = ((float)rand()/(float)(RAND_MAX)) * a;

Примечание: представление с плавающей запятой a должно быть точным, или это никогда не ударит по вашему абсолютному краю case 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

Ответ 2

Вы также можете сгенерировать в диапазоне [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] */
}

Ответ 3

Если вы хотите создать случайный float в диапазоне, попробуйте следующее решение.

#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
-------------------------------------------