如何用数字生成随机单词?

时间:2011-08-17 18:17:27

标签: ruby-on-rails ruby ruby-on-rails-3

我正在寻找一种生成邀请码的方法。我希望代码看起来不像乱码文本:JakSj12

但更像是heroku,使用带有3个数字的有趣单词。

lightspeed131 or happy124, jetski99

如何构建一个采用单词列表的方法,可能是100?并随机分配3个数字?

由于

5 个答案:

答案 0 :(得分:3)

这里给出的其他答案有点慢,因为他们在每次通话时都会洗牌。这有点快一点:

def wordwithnumber(words)
   words[rand(words.length)]+(rand(900)+100).to_s()
end

wordwithnumber(["lightspeed", "happy", "jetski"])

这样每次都会给你三位数,如果你想要一个从0到999的数字,可以相应地修改rand()调用。

答案 1 :(得分:2)

def random_name(words, number = nil)
  number ||= rand(999)

  words.sample.to_s + number.to_s # concatenate a random word and the number
end

# example:
random_name(["lightspeed", "happy"]) # lightspeedXXX, happyXXX (where XXX is a random number)
random_name(["lightspeed", "happy"], 5) # lightspeed5, happy5

答案 2 :(得分:2)

总是3个不同的数字?不是很有效但很简单:

words.zip((100..999).to_a.shuffle).map(&:join)

如果你不介意重复数字(我猜不是):

words.map { |word| word + 3.times.map { rand(10) }.join }

或者只是在Ruby 1.9中:

words.map { |word| word + Random.new.rand(100..999).to_s }

([edit]这会生成100个带数字的单词,这是我所理解的。)

答案 3 :(得分:1)

我会使用以下(非常易读的恕我直言)解决方案:

names = %w[tinky\ winky dipsy laa-laa po]

def random_name(names)
  [names, (100..999).to_a].collect(&:sample).join
end

3.times.collect { random_name(names) }
# => ["dipsy147", "dipsy990", "po756"]

更友好的解决方案:

def random_name(names)
  @numbers ||= (100..999).to_a
  [names, @numbers].collect(&:sample).join
end

答案 4 :(得分:1)

def random_word_and_number( words, max=999 )
  "%s%0#{max.to_s.length}d" % [ words.sample, rand(max+1) ]
end 

(1..4).map{ random_word_and_number( %w[ foo bar jim jam ] ) }
#=> ["jim048", "bar567", "jim252", "foo397"]

让我们指定任意最大值,同时确保所有答案都具有相同的位数。