在Ruby中,什么是可以生成8个字符的随机字符串的优雅行?
Rails教程中有一行:在Ruby中,什么是可以生成8个字符的随机字符串的优雅行?,ruby,Ruby,Rails教程中有一行: ('a'..'z').to_a.shuffle[0..7].join 它可以生成“zwnrfxte”,但不再使用相同的字符。什么是优雅的线条,它可以?一个可以同时使用a..z和a..z?字母=('a'..'z')。到a+('a'..'z')。到a a = ('a'..'z').to_a + ('A'..'Z').to_a 0.upto(7).map{|x| a[ rand( a.size ) ] } rand|u string=(0..7).injection(“
('a'..'z').to_a.shuffle[0..7].join
它可以生成“zwnrfxte”
,但不再使用相同的字符。什么是优雅的线条,它可以?一个可以同时使用a..z和a..z?字母=('a'..'z')。到a+('a'..'z')。到a
a = ('a'..'z').to_a + ('A'..'Z').to_a
0.upto(7).map{|x| a[ rand( a.size ) ] }
rand|u string=(0..7).injection(“”{| s | s只是为了好玩,这里还有一些:
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"
在1.9中,这可以以非常干净的方式完成:
>> 8.times.map { [*?a..?z,*?A..?Z].sample }.join #=> "kmQQvuPd"
字符将重复,如本例中较小字符范围所示:
>> 8.times.map { [*?a..?c,*?A..?C].sample }.join #=> "CaACAaBa"
不过,您可能希望将字母数组存储在单独的变量中:
>> letters = [*?a..?z,*?A..?Z] #=> ["A", "B", "C", ...]
>> 8.times.map { letters.sample }.join #=> "HBKKbnzx"
加密安全随机性的混合熵
(至少对于Linux/Unix/Mac。)或作为一个单行程序(0..7)。将{('a'..'z')映射到_a.concat('a'..'z')。映射到_a.sample}。join@mike..inject块中有2个参数,对吗?u只给出了1。1行程序给出了9个字符,因为。
是包含在内的。@rubyprince,是的,这是有意的。我想使用inject/reduce作为它的“reduce to a string”这样我就不必使用jointhis8.times.map{a[rand(a.size)]}.join
也很好…在Ruby 1.9.2中尝试过这不是一个1行程序…只需说:p只是替换('a''z')。用('a''z')替换a
。到a+('a''z')。到a
将是最简单的解决方案。字符需要能够重复
>> 8.times.map { [*?a..?c,*?A..?C].sample }.join #=> "CaACAaBa"
>> letters = [*?a..?z,*?A..?Z] #=> ["A", "B", "C", ...]
>> 8.times.map { letters.sample }.join #=> "HBKKbnzx"
File.open('/dev/random', 'r') { |f| f.sysread(8).tr "\0-\377", "a-zA-Z"*5 }