2017-02-04 3 views
0

У меня есть код, который будет генерировать случайные числа, если только сгенерированное случайное число не равно 0. Когда результат равен 0, цикл прерывается.Как суммировать случайные числа, сгенерированные в ruby ​​

Итак, когда цикл прерывается, мне нужен код, который продолжает добавлять случайные числа, которые сгенерированы и отображать их в последний раз. Могу ли я сделать это в рубине?

def batting 
    loop do 
    runs = [0,1,2,3,4,5,6] 
    myruns = runs.shuffle.first 
    Newscore = 
    puts "Press W to hit a shot" 
    user_input = gets.chomp 
    while user_input.include? "W" 
     puts myruns 
     until myruns == 0 
      break 
      Score = Score + myruns 
      break 

Это бросает Dynamic Constant assignment ошибку в Score = Score + myruns, которые я в принципе думаю, его неправильно, так как myruns постоянно меняются при каждом генерируемой случае?

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

Может кто-нибудь помочь?

ответ

1

Может быть вы ищете что-то вроде этого?

def batting 
    runs = [0,1,2,3,4,5,6] 
    final_score = 0 
    puts "Press W to hit a shot" 
    user_input = gets.chomp  

    while user_input.include? "W" 
    myruns = runs.sample 

    if myruns != 0 
     final_score += myruns 
    else 
     break 
    end 

    puts "myruns=#{myruns}","final_score=#{final_score}" 
    puts "Press W to hit a shot" 
    user_input = gets.chomp 
    end 
    puts "myruns=#{myruns}","final_score=#{final_score}" 
end 
+0

Благодарим за это, он на самом деле печатает несколько случайных чисел, а не по одному за раз и почему «myruns = runs.sample» создан дважды? один раз в цикле 'while' и в следующий раз в' до '? –

+0

Код, который я написал выше, печатает одно случайное число каждый раз, когда вы нажимаете 'W'. Я хотел создать переменную, которая складывала бы случайные числа, генерируемые каждый раз, до тех пор, пока myruns = 0, не опубликуйте «break» и не добавьте сумму в итоговый балл, так что каждый раз этот 'def' вызывается, это не мешает окончательному счету. Для этого мне понадобится переменная, которая хранит сумму, а не массив. –

+0

Не могли бы вы быть более ясными, что вам нужно, чтобы просто на словах? –

0

Вы можете сделать что-то вроде этого:

def batting 
    loop.with_object([]) do |_,obj| 
    x = rand 7 
    x == 0 ? raise(StopIteration) : obj << x 
    end.sum 
end 

batting #=> 33 
batting #=> 0 
batting #=> 18 

Использование loop это постоянно создает случайные числа от 0 - 6 с rand 7. Мы используем тернарный оператор для остановки цикла с StopIteration, если x == 0, в противном случае мы нажимаем x в массив obj (который изначально []). Наконец, мы суммируем массив obj.

Основные методы: loop, Enumerable#with_object, rand, Array#sum

+1

huh, 'raise (StopIteration)'? Почему бы не просто «перерыв»? –

+0

@ Sagarpandya82 Любая разница между 'break' и' Stopiteration' ??? –

+0

@ Сергио Туленцев хорошо, я в двух умах. Особенно после прочтения этой дискуссии в комментариях здесь http://stackoverflow.com/a/41173887/5101493 –