Ruby-如何从两个范围中选择一个随机字符

时间:2019-02-23 23:34:04

标签: ruby

我有两个范围-97..122和49..57 (它们是字母和数字)。 我可以这样做,例如rand(97..122).chr来获得随机字母。

如果我想要一个数字或数字,我该怎么做?
类似rand([97..122, 49..57]).chr
但是我不确定如何将范围加在一起-rand取一个范围,但不取这个范围。

5 个答案:

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