Проблема с генерацией случайных чисел в Lua

#lua

#lua

Вопрос:

Мы выполняем задачу, поскольку принимаем число в качестве начального значения для math.randomseed() и генерируем случайное целое число (интервал [1,6]), используя math.random() во время каждой итерации цикла, и продолжаем цикл, пока число не станет равным 6.

Для которого мы написали код как

 i = io.read()
local count = 0
math.randomseed(i)
for x = 1, 4 do
    value = math.random(1, 6)
    print(value)
    count = count   1 
end
print(count)
  

Нам не удалось пройти тест, потому что

     Input (stdin)
    Run as Custom Input
    0

    Your Output (stdout)
     3
     5
     5
     6
     2

    Expected Output
    3
    5
    5
    6
    4
  

Пожалуйста, помогите нам

Комментарии:

1. предполагается, что вы запускаете цикл до тех пор, пока случайное значение не будет равно шести. так что перестаньте менять ограничение цикла for каждые 2 минуты. не могли бы вы, пожалуйста, прочитать руководство по Lua? если вам нужно что-то повторять до тех пор, пока не будет выполнено какое-либо условие, почему бы не дать шанс оператору repeat until?

2. это окончательный код, который мы написали, и сейчас он все еще не работает как проблема…

3. i = io.read() local count = 0 local a = 6 math.randomseed(i) для x = 1, 4 делаем value = math.random(1, 6) повторяем печать (значение) до тех пор, пока значение < a count = count 1 завершает печать (количество)

4. и проверьте задачу. почему ожидаемый результат равен 3 5 5 6 4, если предполагается, что вы будете запускать его до тех пор, пока число не будет равно 6. тогда ожидаемый результат должен быть равен 3 5 5 6. но независимо от этого ваш код по-прежнему неверен

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

Ответ №1:

В операционном коде, похоже, возникают проблемы с циклом. Я рекомендую OP прочитать документацию Lua о структурах управления, где описаны Lua while , repeat until и goto , а также следующий раздел руководства о Lua For Statement. Сложно написать любую программу на любом языке, не понимая фундаментальных управляющих структур языка.

Проблема OP может быть решена различными способами.

Использование for

 -- for version
i = io.read()
math.randomseed(i)

local count
for i = 1, math.huge do
  local value = math.random(1, 6)
  print(value)
  count = i
  if value == 6 then break end
end
print(count)
  

Здесь math.huge самое большое представимое число в Lua, обычно специальное значение inf , что делает это фактически бесконечным циклом. Переменная i отслеживает, сколько случайных чисел было сгенерировано, но поскольку i она не будет видна вне цикла, count переменная необходима для копирования значения i , чтобы его можно было распечатать в конце.

Использование while

 -- while version
i = io.read()
math.randomseed(i)

local value = math.random(1, 6)
local count = 1
while value < 6 do
  print(value)
  count = count   1
  value = math.random(1, 6)
end
print(value)
print(count)
  

Здесь зацикливающая конструкция начинается с теста, поэтому перед началом цикла необходимо создать тестовое значение. Это означает, что count перед началом цикла должно быть инициализировано значение 1, и это также означает, что вызов math.random будет дублироваться. Некрасиво.

Использование repeat until

 -- repeat until version
i = io.read()
math.randomseed(i)

local count = 0
repeat
  local value = math.random(1, 6)
  print(value)
  count = count   1
until value == 6
print(count)
  

Здесь тест выполняется в конце построения цикла. Это позволяет вызвать код math.random только один раз.

Использование goto

 -- goto version
i = io.read()
math.randomseed(i)

local count = 0
::loop::
local value = math.random(1, 6)
print(value)
count = count   1
if value < 6 then goto loop end
print(count)
  

Вероятно, вам не следует использовать goto для решения этой проблемы, но вы можете. Вы должны быть осторожны с goto в Lua; вы не можете перейти в блок, из функции или в область видимости локальной переменной.

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

Все четыре версии выдают идентичные выходные данные для одних и тех же входных данных:

 $ lua loops.lua
42
2
5
3
2
2
4
6
7