我正在寻找一种方法来生成邀请码。我宁愿这些代码并没有看起来像乱码:JakSj12如何用数字生成随机单词?
反倒是更像Heroku的,使用具有3个数字一个有趣的词。
lightspeed131 or happy124, jetski99
我怎样才能建立一个需要的单词列表,也许100的方法?并随机分配3个号码给他们?
感谢
我正在寻找一种方法来生成邀请码。我宁愿这些代码并没有看起来像乱码:JakSj12如何用数字生成随机单词?
反倒是更像Heroku的,使用具有3个数字一个有趣的词。
lightspeed131 or happy124, jetski99
我怎样才能建立一个需要的单词列表,也许100的方法?并随机分配3个号码给他们?
感谢
这里给出其他的答案是有点慢,因为它们舒在每次通话中提供他们的名单。这里的东西有点快:
def wordwithnumber(words)
words[rand(words.length)]+(rand(900)+100).to_s()
end
wordwithnumber(["lightspeed", "happy", "jetski"])
这给了你每次三位数字,如果你想有一个从0到999修改兰特()调用相应。
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
你可能想,要成为'兰特(899)+ 100',如果你想保证三位数。 – tadman
@tadman是的,+1。然而,在他提供的例子(heroku)中,只有两位数字的数字,所以我推断他们可能是任何数字,只要他们有最多3位数字。 –
如果你想3个数字,你也可以做'的sprintf(“%s%03D”,words.sample.to_s,数量)' –
总是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个字与数字,这是我的理解。)
我会用下面的(非常可读恕我直言)解决方案:
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的名字将永远是数组中的第一个名字。” - 你能解释一下吗? –
我的“进一步......”声明是我的错误。我误解了你的代码。我已经删除了我的评论,并删除了我的downvote(尽管仍然没有很好的理由创建一个900元素的数组,以随机选取一个值)。 – Phrogz
此应用程序/代码的依赖项。在rake任务或其他后台工作中,我没有看到问题。你甚至可以为数字添加一个缓存。将编辑我的解决方案。 –
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"]
让我们指定同时确保任意最大值所有答案都有相同的位数。
@AnApprentice,如果是这样的选择的答案,那么你只想要一个字,这个问题说:“受让人3号给他们“,我想你的意思是”它“。 – tokland
@rwat注意,Ruby 1.9的,你可以代替'字[兰特(words.length)]'使用'words.sample'。 – Phrogz
@Phrogz酷,这是一个方便的功能,我不知道:) – rwat