Как лучше всего создать случайное плавание в диапазоне между двумя плаваниями - PullRequest
38 голосов
/ 11 ноября 2009

Я знаю, что могу генерировать случайные числа с помощью rand (max). Я пытался создать плавающий диапазон, это не должно быть сложно. Но, например, rand (1.4512) возвращает 0, поэтому rand не рассчитывается с помощью float. Теперь я попробовал небольшой трюк, преобразовав вещь в целое число и после случайного выбора подходящего числа в моем желаемом диапазоне, вычислив его обратно до числа с плавающей запятой ... который не работает.

Мой вопрос: как сделать это лучше? Если нет лучшего способа, почему этот не работает? (Может быть, это слишком поздно для меня, я должен был заснуть 2 часа назад ..). Все это нацелено на то, чтобы вычислить поле «позиция» для записей базы данных, чтобы пользователи могли заказать их вручную. Я никогда раньше такого не делал, может, кто-нибудь подскажет мне лучшее решение.

Вот код на данный момент:

def calculate_position(@elements, index)
    min = @elements[index].position

    if @elements[index + 1].nil?
        pos = min + 1
    else
        pos = min + (rand(@elements[index + 1].position * 10000000000) / 10000000000)
    end

    return pos
end

Спасибо!

Ответы [ 4 ]

79 голосов
/ 01 апреля 2014

Передайте диапазон значений с плавающей точкой до rand

Если вы хотите «создать случайное число с плавающей точкой в ​​диапазоне между двумя числами», просто передайте диапазон значений с плавающей точкой rand.

rand(11.2...76.9)

(протестировано с Ruby 2.1)

47 голосов
/ 11 ноября 2009

Подведем итоги:

rand () сгенерирует (псевдо) случайное плавать между 0 и 1.

rand (int) сгенерирует (псевдо-) случайное целое число от 0 до внутр.

Так что-то вроде:

def range (min, max)
    rand * (max-min) + min
end

Должен делать хорошо.

Обновление:

Только что протестировано с небольшим модульным тестом:

def testRange
    min = 1
    max = 100

    1_000_000.times { 
        result = range min, max
        print "ERROR" if result < min || result  > max
    }
end

Хорошо выглядит.

12 голосов
/ 18 ноября 2013

В 1.9 и 2.0 вы можете задать аргумент диапазона rand:

irb(main):001:0> 10.times { puts rand Math::E..Math::PI }
3.0656267148715446
2.7813979580609587
2.7661725184200563
2.9745784681934655
2.852157154320737
2.741063222095785
2.992638029938756
3.0713152547478866
2.879739743508003
2.7836491029737407
=> 10
3 голосов
/ 11 ноября 2009

Я думаю, что вам лучше всего использовать rand () для генерации случайного числа с плавающей точкой от 0 до 1, а затем умножить, чтобы установить диапазон, и добавить, чтобы установить смещение:

def float_rand(start_num, end_num=0)
  width = end_num-start_num
  return (rand*width)+start_num
end

Примечание: поскольку порядок терминов не имеет значения, установка по умолчанию для end_num значения 0 позволяет получить случайное значение с плавающей точкой от 0 до x с помощью float_rand (x).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...