Они не одно и то же.
(1..10).include?(10.5)
# => false
(1...11).include?(10.5)
# => true
(1..10).step(0.2).to_a
# => [1.0, 1.2, 1.4, ... 10.0]
(1...11).step(0.2).to_a
# => [1.0, 1.2, 1.4, ... 10.0, 10.2, 10.4, 10.6, 10.8] # (rounded for space)
И если вы ожидаете, что это будет выполнено в 50% случаев, вы совершаете (очень крошечную) ошибку:
if (0..0.5).include?(rand())
, что эквивалентно
if rand() <= 0.5
тогда как это истинные 50%:
if (0...0.5).include?(rand())
if rand() < 0.5
Как отмечает Кэри Свовеланд, двухточечный литерал создает диапазон, который описывает start <= x <= finish
, тогда как трехточечный литерал создает диапазон с exclude_end
, установленным на true
, который описывает start <= x < finish
.