Lua中随机数生成问题

我们正在执行任务,接受一个作为math.randomseed()种子值的数字,在每次循环中使用math.random()生成一个随机整数(区间[1,6]),并继续循环直到数字为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)

我们未能通过测试,因为

    输入(stdin)
    作为自定义输入运行
    0

    您的输出(stdout3
     5
     5
     6
     2

    期望的输出
    3
    5
    5
    6
    4

请帮助我们

点赞
用户6879826
用户6879826

OP 的代码似乎有循环问题。我鼓励 OP 阅读 Lua 的 控制结构 文档,其中介绍了 Lua 的 whilerepeat untilgoto,以及下面关于 Lua 的 For 语句的部分。如果不了解语言的基本控制结构,很难编写任何语言的程序。

OP 的问题可以用多种方式解决。

使用 for

-- for 版本
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 版本
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 版本
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 版本
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 来解决这个问题,但你可以。在 Lua 中使用 goto 必须非常小心;不能跳入一个块中,也不能跳出一个函数或进入一个局部变量的作用域中。

正如你所看到的,这些循环结构有一些微妙之处,使用它们需要对细节有一定的了解。

对于相同的输入,这四个版本都会产生相同的输出:

$ lua loops.lua
42
2
5
3
2
2
4
6
7
2020-08-14 13:02:14