Rails教程中有一行:
('a'..'z').to_a.shuffle[0..7].join
可以生成"zwnrfxte"
,但它不再使用相同的字符。什么是优雅的线条可以?还有一个可以同时使用a..z和A..Z?
答案 0 :(得分:3)
letters = ('a'..'z').to_a + ('A'..'Z').to_a
rand_string = (0..7).inject(""){|s| s << letters.sample}
或一个班轮:
(0..7).inject(""){|s| s << (('a'..'z').to_a+('A'..'Z').to_a).sample}
这将使用相同的字符(如果已选择)并且它具有a-zA-Z。
答案 1 :(得分:3)
在1.9中,这可以用非常干净的方式完成:
>> 8.times.map { [*?a..?z,*?A..?Z].sample }.join #=> "kmQQvuPd"
字符将重复,因为此示例使用较小的字符范围显示:
>> 8.times.map { [*?a..?c,*?A..?C].sample }.join #=> "CaACAaBa"
您可能希望将letters数组存储在单独的变量中:
>> letters = [*?a..?z,*?A..?Z] #=> ["A", "B", "C", ...]
>> 8.times.map { letters.sample }.join #=> "HBKKbnzx"
答案 2 :(得分:2)
a = ('a'..'z').to_a + ('A'..'Z').to_a
0.upto(7).map{|x| a[ rand( a.size ) ] }
答案 3 :(得分:1)
File.open('/dev/random', 'r') { |f| f.sysread(8).tr "\0-\377", "a-zA-Z"*5 }
(至少对于Linux / Unix / Mac。)
答案 4 :(得分:0)
只是为了它的地狱还有更多:
8.times.map {(rand(26) + (rand > 0.5 ? 65 : 97)).chr}.join
=> "JnFHpIqb"
8.times.map {((r = rand(26)) > 13 ? r + 65 : r + 97).chr}.join
=> "PQYciXcg"
这两个都可以适应使用注入:
8.times.inject("") {|s| s += (rand(26) + (rand > 0.5 ? 65 : 97)).chr}
=> "WFkVqgeG"
8.times.inject("") {|s| s += ((r = rand(26)) > 13 ? r + 65 : r+ 97).chr}
=> "faQnScmd"