2011-08-17 29 views
3

我正在寻找一种方法来生成邀请码。我宁愿这些代码并没有看起来像乱码:JakSj12如何用数字生成随机单词?

反倒是更像Heroku的,使用具有3个数字一个有趣的词。

lightspeed131 or happy124, jetski99 

我怎样才能建立一个需要的单词列表,也许100的方法?并随机分配3个号码给他们?

感谢

回答

3

这里给出其他的答案是有点慢,因为它们舒在每次通话中提供他们的名单。这里的东西有点快:

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

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

这给了你每次三位数字,如果你想有一个从0到999修改兰特()调用相应。

+0

@AnApprentice,如果是这样的选择的答案,那么你只想要一个字,这个问题说:“受让人3号给他们“,我想你的意思是”它“。 – tokland

+2

@rwat注意,Ruby 1.9的,你可以代替'字[兰特(words.length)]'使用'words.sample'。 – Phrogz

+0

@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

你可能想,要成为'兰特(899)+ 100',如果你想保证三位数。 – tadman

+0

@tadman是的,+1。然而,在他提供的例子(heroku)中,只有两位数字的数字,所以我推断他们可能是任何数字,只要他们有最多3位数字。 –

+1

如果你想3个数字,你也可以做'的sprintf(“%s%03D”,​​words.sample.to_s,数量)' –

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 } 

([编辑]这产生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 
+0

“此外,与编号100的名字将永远是数组中的第一个名字。” - 你能解释一下吗? –

+0

我的“进一步......”声明是我的错误。我误解了你的代码。我已经删除了我的评论,并删除了我的downvote(尽管仍然没有很好的理由创建一个900元素的数组,以随机选取一个值)。 – Phrogz

+0

此应用程序/代码的依赖项。在rake任务或其他后台工作中,我没有看到问题。你甚至可以为数字添加一个缓存。将编辑我的解决方案。 –

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

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