Как лучше всего создать случайный поплавок в диапазоне между двумя поплавками
Я знаю, что могу генерировать случайные поплавки с rand (max). Я попытался создать float в диапазоне, это не должно быть сложно. Но, например, rand (1.4512) возвращает 0, поэтому rand не вычисляется с помощью float. Теперь я попробовал небольшой трюк, преобразовывая предмет в целое число и после рандомизации подходящего числа в моем желаемом диапазоне, вычисляя его обратно в 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
Спасибо!
Ответы
Ответ 1
Обозначим:
rand() будет генерировать (psuedo-) случайный float между 0 и 1.
rand (int) будет генерировать (psuedo-) случайное целое число от 0 до внутр.
Так что-то вроде:
def range (min, max)
rand * (max-min) + min
end
Делать это приятно.
Update:
Просто протестирован с небольшим unit test:
def testRange
min = 1
max = 100
1_000_000.times {
result = range min, max
print "ERROR" if result < min || result > max
}
end
Выглядит хорошо.
Ответ 2
Провести диапазон поплавков до rand
Если вы хотите "создать случайный float в диапазоне между двумя поплавками", просто передайте диапазон поплавков на rand
.
rand(11.2...76.9)
(Протестировано с Ruby 2.1)
Ответ 3
В 1.9 и 2.0 вы можете задать аргумент range для 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
Ответ 4
Я думаю, что лучше всего использовать 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, вы можете получить случайное значение float между 0 и x с помощью float_rand (x).