如何重用随机字母

时间:2017-04-07 19:30:02

标签: ruby random

我正在尝试让我的代码随机生成一个字母,以开始“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

我尝试使用以下术语查找结果:“生成相同的随机字母”,“重复使用随机字母”,“存储随机数字”等,但这些搜索没有帮助。

2 个答案:

答案 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"]

以更低的噪音完成同样的事情。