我正在尝试让我的代码随机生成一个字母,以开始“zip”,“zap”和“zop”的每个单词。每次运行代码时都应选择不同的字母,但每个单词都需要以相同的字母开头。
我似乎无法重复使用随机字母三次:
def generate
puts "3... 2... 1... IMPROV: (enter any letter)"
text = gets.chomp.upcase
puts text + "IP, " + text + "AP, " + text + "OP!"
puts "My turn!"
yield
puts g_l(1) + "IP, " + "#{g_l(1)}AP, " + "#{g_l(1)}OP!"
end
generate do
def g_l(number)
charset = Array('A'..'Z') - Array["A", "E", "I", "O", "U"]
Array.new(number) { charset.sample } .join
end
end
我的目标是什么:
Run 1: HIP, HAP, HOP!
Run 2: DIP, DAP, DOP!
Run 3: SIP, SAP, SOP!
我得到了什么:
Run 1: HIP, ZAP COP
Run 2: FIP, WAP, DOP
Run 3: RIP, TAP, BOP
我尝试使用以下术语查找结果:“生成相同的随机字母”,“重复使用随机字母”,“存储随机数字”等,但这些搜索没有帮助。
答案 0 :(得分:3)
每次使用g_l(1)
时都要进行重新采样
而是保存char = g_l(1)
并重复使用相同的char
def generate
puts "3... 2... 1... IMPROV: (enter any letter)"
text = gets.chomp.upcase
puts text + "IP, " + text + "AP, " + text + "OP!"
puts "My turn!"
yield
char = g_l(1)
puts char + "IP, " + "#{char}AP, " + "#{char}OP!"
end
generate do
def g_l(number)
charset = Array('A'..'Z') - Array["A", "E", "I", "O", "U"]
Array.new(number) { charset.sample } .join
end
end
或使整个事情成为可以调用的函数:
def answer
puts "3... 2... 1... IMPROV: (enter any letter)"
text = gets.chomp[0].upcase # Should they be able to type more than one letter?
charset = Array('A'..'Z') - Array["A", "E", "I", "O", "U"]
puts text + "IP, " + text + "AP, " + text + "OP!"
puts "My turn!"
char = charset.sample
puts char + "IP, " + "#{char}AP, " + "#{char}OP!"
end
answer
答案 1 :(得分:1)
你的代码的问题是你正在调用你的角色生成器三次导致三个不同的字母,当你真的只想调用它一次以获得一个你要使用三次的角色时:
g_l(1) + "IP, " + "#{g_l(1)}AP, " + "#{g_l(1)}OP!"
g_l(1)
的每次通话都会产生一封新信。
供参考,以下是我的写作方式:
LPHBT = (('A'..'Z').to_a - %w[A E I O U])
def output(c)
'%sIP, %sAP, %sOP!' % ([c] * 3)
end
def play
puts '3... 2... 1... IMPROV: (enter any letter)'
# text = gets.chomp.upcase
text = 'A'
puts output(text)
puts 'My turn!'
puts output(yield)
end
play { LPHBT.sample }
# >> 3... 2... 1... IMPROV: (enter any letter)
# >> AIP, AAP, AOP!
# >> My turn!
# >> TIP, TAP, TOP!
以下是一些正在发生的事情:
'%sIP, %sAP, %sOP!' % ([c] * 3)
使用简单的格式字符串来插入([c] * 3)
的结果,该结果会创建c
的三元素数组:
['c'] * 3 # => ["c", "c", "c"]
像你一样使用Array.new
会浪费击键并降低可读性。
('A'..'Z').to_a - %w[A E I O U] # => ["B", "C", "D", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"]
以更低的噪音完成同样的事情。