我有两个范围-97..122和49..57 (它们是字母和数字)。 我可以这样做,例如rand(97..122).chr来获得随机字母。
如果我想要一个数字或数字,我该怎么做?
类似rand([97..122, 49..57]).chr
但是我不确定如何将范围加在一起-rand取一个范围,但不取这个范围。
答案 0 :(得分:4)
Numbers 0-9 and all letters, that is how numbers are represented in base 36:
rand(36).to_s(36)
答案 1 :(得分:2)
两种避免创建数组的方法。
#1
rand(35).yield_self {|rn| rn + (rn < 10 ? 49 : 87)}.chr
注意:
35 = 57-48 + 122-96
和
10 = 58-48
#2¯\ _(ツ)_ /¯
"0123456789abcdefghijklmnopqrstuvwxyz"[rand 36]
答案 2 :(得分:0)
您可以将范围转换为数组:
((97..122).to_a + (49..57).to_a).sample.chr
或
(Array(97..122) + Array(49..57)).sample.chr
或
([*97..122] + [*49..57]).sample.chr
答案 3 :(得分:0)
您可以通过条件采样做到这一点:
rand <= 26r / 35 ? rand(97..122).chr : rand(49..57).chr
避免了以绘制另一个随机值为代价的数组。 26是第一个范围的长度,35是两个范围的总长度,因此,在35次绘制第一个范围的值的35次中,有26次是从第二个范围绘制的。
答案 4 :(得分:0)
也许从包含从范围生成的两个随机数的数组中采样? 为了加权概率,从26 /9≈3开始:
([rand(97..122)]*3 << rand(49..57)).sample.chr