random - Ruby如何最佳地生成一个随机字符串

  显示原文与译文双语对照的内容

我目前正在使用以下方法生成 8字符伪随机大写字符串 [A-Z ]


value =""; 8.times{value <<(65 + rand(25)).chr}

但它看起来是无用的,因为它不是一个单独的语句,它不能作为参数传递。 为了得到一个混合大小写字符串 [a-zA-Z],我进一步使用它


value =""; 8.times{value <<((rand(2)==1?65:97) + rand(25)).chr}

看起来像垃圾。谁都有更好的方法?

时间:


(0...8).map { (65 + rand(26)).chr }.join

我花了太多时间在高尔夫上。


(0...50).map { ('a'..'z').to_a[rand(26)] }.join

大量的WTFBBQ因子。

最后一个更加混乱,但更灵活,更少的循环:


o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten
string = (0...50).map { o[rand(o.length)] }.join

我使用这个来生成随机的URL友好字符串。


rand(36**length).to_s(36)

它生成随机的小写a-z和 0 -9. 它不是非常可以定制的,但它是短的和干净的。

这个解决方案生成一个易于阅读的字符串,用于激活代码;我不希望人混淆 8,1和I,0,1,等等。


# Generates a random string from a set of easily readable characters
def generate_activation_code(size = 6)
 charset = %w{ 2 3 4 6 7 9 A C D E F G H J K M N P Q R T V W X Y Z}
 (0...size).map{ charset.to_a[rand(charset.size)] }.join
end

有些人提到了类似的东西,但这使用了URL安全函数。


require 'securerandom'
p SecureRandom.urlsafe_base64(5) #=>"UtM7aa8"
p SecureRandom.urlsafe_base64 #=>"UZLdOkzop70Ddx-IJR0ABg"
p SecureRandom.urlsafe_base64(nil, true) #=>"i0XQ-7gglIsHGV2_BNPrdQ=="

结果可能包含 A-Z,A-Z,0 -9,"-"和"_"。 如果填充为真,也使用"="。


[*('A'..'Z')].sample(8).join

生成随机 8字母字符串( 例如。 NVAYXHGR )


([*('A'..'Z'),*('0'..'9')]-%w(0 1 I O)).sample(8).join

生成随机 8个字符字符串( 例如。 3 PH4SWF2 ),排除 0/1/I/O. ruby 1.9

我不记得我在哪里找到了这个,但它似乎是最好的和最简单的流程:


def random_string(length=10)
 chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
 password = ''
 length.times { password <<chars[rand(chars.size)] }
 password
end

...