我目前正在为“A”生成一个8字符伪随机大写字符串。。“Z”:
value = ""; 8.times{value << (65 + rand(25)).chr}
但它看起来不干净,而且不能作为参数传递,因为它不是一个单独的语句。要获取混合大小写字符串“a”。。“z”加“A”。。“Z”,我将其更改为:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
但它看起来像垃圾。
有人有更好的方法吗?
我目前正在为“A”生成一个8字符伪随机大写字符串。。“Z”:
value = ""; 8.times{value << (65 + rand(25)).chr}
但它看起来不干净,而且不能作为参数传递,因为它不是一个单独的语句。要获取混合大小写字符串“a”。。“z”加“A”。。“Z”,我将其更改为:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
但它看起来像垃圾。
有人有更好的方法吗?
当前回答
这几乎是丑陋的,但也许是朝着正确的方向迈出的一步?
(1..8).map{|i| ('a'..'z').to_a[rand(26)]}.join
其他回答
要将您的第一句话变成一句话:
(0...8).collect { |n| value << (65 + rand(25)).chr }.join()
我认为这是简洁、清晰和易于修改的良好平衡。
characters = ('a'..'z').to_a + ('A'..'Z').to_a
# Prior to 1.9, use .choice, not .sample
(0..8).map{characters.sample}.join
易于修改
例如,包括数字:
characters = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a
十六进制大写:
characters = ('A'..'F').to_a + (0..9).to_a
对于一系列真正令人印象深刻的角色:
characters = (32..126).to_a.pack('U*').chars.to_a
您可以使用Ruby Gem Facets中的String#随机。
它基本上做到了这一点:
class String
def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
characters = character_set.map { |i| i.to_a }.flatten
characters_len = characters.length
(0...len).map{ characters[rand(characters_len)] }.join
end
end
Array.new(n){[*“0”..“9”].sample}.join,其中n=8。
广义:Array.new(n){[*“A”..“Z”,*“0”..“9”].sample}.join等。
来自:“生成伪随机字符串A-Z,0-9”。
另一个适用于Ruby 1.8+且速度快的技巧是:
>> require "openssl"
>> OpenSSL::Random.random_bytes(20).unpack('H*').join
=> "2f3ff53dd712ba2303a573d9f9a8c1dbc1942d28"
它得到的是随机十六进制字符串。类似的方式,您应该能够生成base64字符串('M*')。