在Ruby中,什么是优雅的行,可以生成一个包含8个字符的随机字符串?

时间:2011-04-16 02:29:11

标签: ruby

Rails教程中有一行:

('a'..'z').to_a.shuffle[0..7].join

可以生成"zwnrfxte",但它不再使用相同的字符。什么是优雅的线条可以?还有一个可以同时使用a..z和A..Z?

5 个答案:

答案 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。

使用Array#sample

答案 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"