Производить случайный поплавок с отрицательного на положительный диапазон?

Я пытаюсь создать случайный float в диапазоне -50.0 и 50.0 включительно, используя rand(). Я везде искал ответ, но он касается операторов ints и%.

Ответ 1

Попробуйте следующее:

float RandomNumber(float Min, float Max)
{
    return ((float(rand()) / float(RAND_MAX)) * (Max - Min)) + Min;
}

Ответ 2

Попробуйте следующее:

  • rand() дает число от 0 до RAND_MAX
  • разделите его на RAND_MAX, чтобы получить число от 0 до 1
  • вы хотите диапазон от 100 до 50, поэтому умножьте на 100.0
  • наконец, сдвиньте центр от 50 (от 0 до 100 на точку 3) до нуля, вычитая 50.0

Ответ 3

((float)rand())/RAND_MAX * 100.0 - 50.0

Ответ 4

Честно говоря, все существующие ответы не объясняют, что в их решениях есть изменение в распределении (я предполагаю, что rand() следует за равномерным распределением! исправьте меня, если я ошибаюсь, пожалуйста). Используйте библиотеку, пожалуйста, и моя рекомендация использует новые возможности в С++ 0x:

#include <random>
#include <functional>

int main()
{
    std::mt19937 generator;
    std::uniform_real_distribution<float> uniform_distribution(-50.0, 50.0);
    auto my_rand = std::bind(uniform_distribution, generator);
}

Если вы не можете, Boost - идеальный выбор. Таким образом, вы можете использовать my_rand() так же, как good ol 'rand():

std::vector<float> random_numbers(1000);
std::generate(random_numbers.begin(), random_numbers.end(), my_rand);