Rubyrush: Метод rand и задачки про монетки «Орёл или решка»

Ruby для новичков [Rubyrush]

Продолжаю своё героическое и непомерно интересное прохождение бесплатного курса Rubyrush. На очереди шаг № 14.

Задачка первая: «Просто монетка»

Требуется написать программу, которая будет генерировать 0 или 1 случайным образом. По условиям задачки, если выпадает 0 — пишем на экране — «Выпал орёл», а если 1 — пишем «Выпала решка». Что ж преступим.

Ранее мы использовали в самом первом уроке метод sample, который выводил случайный вариант из массива. думаю тут надо аналогичное использовать. К тому же у нас два условия, а значит используем тот самый условный оператор if.

Моё решение задачи выглядит следующим образом:

# создаём массив с двумя элементами
coin = [ 0, 1 ]

# еще одна переменная - бросок, которой присваиваем случайный вариант из массива
throw = coin.sample

# пишем условие при котором все как в задании - если нолик - значит пишем что выпал орёл, а если единица - пишем что решка
if throw == 0
  puts "Выпал орёл!"
else
  puts "Выпала решка!"
end

После самостоятельного выполнения я полез в решение, которое есть в уроке. У них там в каждом уроке можно поп ссылочек на гитхаб перейти и там будет вариант решения.

В их варианте задачу решают по средствам метода rand — это самый простой способ получить случайное число. Вот как выглядит их решение:

if rand(2) == 1
  puts 'Выпала решка'
else
  puts 'Выпал орел'
end

В их решении мне нравится, что кода гораздо меньше чему меня. Нет необходимости создавать массив. Вот только нужно получше разобраться в этом методе rand, что бы взять на вооружение и в след раз использовать.

Метод rand

rand — метод возвращающий = генерирующий случайное число. В аргументе можно передать входные данные, например, если передать целое число, то метод будет возвращать случайное ЦЕЛОЕ число от 0 до n-1.

Я не силён в математике, но судя по тестированию программы я понял что n-1 это ограничитель числа, которое может вернуться. Программа, которой в аргументе передаётся четвёрка будет возвращать числа от 0 до 3 включительно.

coin = rand(4)
puts coin
Rubyrush: Метод rand и задачки про монетки "Орёл или решка"
Пример работы метода rand с переданной четвёркой в качестве аргумента.

Программа вида:

coin = rand(0..4)
puts coin

Будет возвращать числа от 0 до 4 включительно.

В последнем варианте программы мы передаем в качестве аргумента ДИАПАЗОН чисел от 0 до 4, а в предыдущем передаем количество вариантов чисел. Это вывод основанный на моих предположениях. Заранее извиняюсь, если я не правильно предположил.

По итогу выполнения задания

В дальнейшем буду более детально изучать метод rand — очень примечательный инструмент.

Погуглив еще, нашёл вот такое пояснение метода

Ruby поставляется с генератором случайных чисел. Метод, возвращающий случайно выбранное число, называется rand. Если вы вызовете rand как есть (без аргументов), вы получите дробное число, большее или равное 0.0 и меньшее 1.0. Если вы дадите методу rand целое (например, 5), он вернёт вам целое число, большее или равное 0 и меньшее, чем 5 (то есть одно из пяти возможных чисел, от 0 до 4).

Задачка вторая: «Непростая монетка»

Для того что бы выполнить следующее задание мне потребуется усложнить программу, написанную на предыдущем шаге. По условиям задания нужно добавить вариант падения монетки на ребро:

Начал с того что модифицировал свой вариант первой программы. Максимально просто в плане логики написания:

if rand(0..10) == 1 || rand(0..10) == 3 || rand(0..10) == 5 || rand(0..10) == 7 || rand(0..10) == 9    
  puts 'Выпала решка'
elsif rand(0..10) == 10
  puts 'Монета встала на ребро'
else
  puts 'Выпал орел'
end

Затем взяв за основу вариант решения из подсказки в прошлом уроке, доработал его и получилось что то подобное:

if rand(11) == 1 || rand(11) == 3 || rand(11) == 5 || rand(11) == 7 || rand(11) == 9
  puts 'Выпала решка'
  elsif rand(11) == 10
    puts 'Монета встала на ребро' 
else
  puts 'Выпал орел'
end

В обоих вариантах я действовал по одному и тому же сценарию:

В аргументе передавал параметры случайного числа от 0 до 10. Если число не чётное — решка, а если чётное — орёл.

К тому же если выпадало число равное 10 — писал что монета встала на ребро.

Но все мои решения немного не правильные, так как по условиям первой задачи у нас выпадает либо 0 либо единица. Ни о каких других числах речи не идёт. Исключение лишь в случае с ребром.

Требуется иначе рассуждать. В подсказке был «жирный намёк» на решение задачи — добавить еще один вызов метода rand с параметром 10 — выбор случайного числа от 0 до 10.

Вот так должна была выглядеть работающая версия программы с монеткой:

if rand(11) == 10
  puts 'Монета встала на ребро'
else
  if rand(2) == 1
    puts 'Выпала решка'
  else
    puts 'Выпал орел'
  end
end

Вариант из готового решения мне оч нравится. Он такой простой и логичный, что я даже почувствовал себя дебилом, потому что сам не смог до этого додуматься. Эх… Нажеюсь что со временем я научась находить оптимальный вариант решения задачь.

Убеждён что это все упирается в практический опыт в решении задач по программированию.

Обзорное видео по теме урока

Юрий Ронин