如何生成带有数字的随机单词?

3
我正在寻找一种生成邀请码的方法。我希望邀请码看起来不像乱码:JakSj12。
相反,我更喜欢像 Heroku 那样使用一个有趣的词和三个数字。
lightspeed131 or happy124, jetski99

我该如何构建一个方法,接收一个单词列表(可能有100个),并随机分配3个数字给它们呢?
谢谢。
5个回答

3

这里给出的其他答案有点慢,因为它们在每次调用时都会打乱它们的列表。这是一种更快的方法:

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

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

这将每次给你三个数字,如果你想要0到999之间的数字,请相应地修改rand()调用。

@AnApprentice,如果那是被选中的答案,那么你只想要一个单词,问题说的是“给它们分配3个数字”,我猜你是指“给它分配”。 - tokland
2
请注意,从Ruby 1.9开始,您可以使用words.sample代替words[rand(words.length)] - Phrogz
@Phrogz 很酷,这是一个我之前不知道的有用函数 :) - rwat

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
如果您想要保证生成三位数的数字,那么您可能希望将其更改为 rand(899) + 100 - tadman
@tadman 没错,+1。然而,在他提供的例子(heroku)中,有些数字只有两位数,所以我推断它们可能是任何数字,只要它们最多有3个数字。 - Thiago Silveira
1
如果你想要三位数字,你也可以这样做sprintf("%s%03d", words.sample.to_s, number) - Chris Bailey

2

总是三个不同的数字?这并不是很高效,但却很简单:

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 }

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

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

此外,带有数字100的名称将始终是数组中的第一个名称。 - 你能解释一下吗? - Mario Uher
我之前说的“进一步...”那句话是我的失误。我误读了你的代码。我已经删除了我的评论并取消了踩(虽然创建一个900元素的数组只为了随机选择一个值仍然没有充分的理由)。 - Phrogz
这取决于应用程序/代码的依赖关系。在rake任务或其他后台作业中,我看不到任何问题。您甚至可以为数字添加缓存。将编辑我的解决方案。 - Mario Uher
你说得没错,性能和内存可能都不会有问题,但我不明白为什么你要费力地写(100..999).to_a.sample,而不是直接用rand(900)+100。只是为了可读性吗? - Phrogz
是的,Ruby对我来说是一种性感的语言。可读性非常重要,否则我会切换回C或其他“丑陋”的语言。 - Mario Uher

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

允许您指定任意最大值,同时确保所有答案具有相同数量的数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接