首页 > 解决方案 > 在 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

请帮助我们

标签: lua

解决方案


OP 代码似乎有循环问题。我鼓励 OP 阅读有关Control Structures的 Lua 文档,其中描述了 Lua 的while,repeat untilgoto,以及以下有关 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将重复调用 to。不漂亮。

使用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

推荐阅读