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

Ruby-如何从两个范围中选择一个随机字符,ruby,Ruby,我有两个范围-97..122和49..57 它们是字母和数字。 例如,我可以使用rand97..122.chr来获得一个随机字母 如果我想要一个数字是或数字,我该怎么做? 类似兰特[97..122,49..57]的东西 但我不知道如何将这些范围添加到一起-rand接受一个范围,但不接受该范围。您可以将范围转换为数组: ((97..122).to_a + (49..57).to_a).sample.chr 或 或 您可以将范围转换为数组: ((97..122).to_a + (49..57).t

我有两个范围-97..122和49..57 它们是字母和数字。 例如,我可以使用rand97..122.chr来获得一个随机字母

如果我想要一个数字是或数字,我该怎么做? 类似兰特[97..122,49..57]的东西
但我不知道如何将这些范围添加到一起-rand接受一个范围,但不接受该范围。

您可以将范围转换为数组:

((97..122).to_a + (49..57).to_a).sample.chr


您可以将范围转换为数组:

((97..122).to_a + (49..57).to_a).sample.chr


您可以使用条件采样进行此操作:

rand <= 26r / 35 ? rand(97..122).chr : rand(49..57).chr

这样就避免了以绘制额外随机值为代价的数组。26是第一个范围的长度,35是两个范围的组合长度,因此35次中有26次从第一个范围绘制值,其余时间从第二个范围绘制值。

您可以使用条件采样:

rand <= 26r / 35 ? rand(97..122).chr : rand(49..57).chr

这样就避免了以绘制额外随机值为代价的数组。26是第一个范围的长度,35是两个范围的组合长度,因此35次中有26次从第一个范围绘制值,其余时间从第二个范围绘制值。

避免创建数组的两种方法

一,

2’\_ツ_/“”


避免创建数组的两种方法

一,

2’\_ツ_/“”


数字0-9和所有字母,即数字在基数36中的表示方式:

rand(36).to_s(36)

数字0-9和所有字母,即数字在基数36中的表示方式:

rand(36).to_s(36)

可能是从一个包含两个随机数的数组中进行采样? 用于加权概率,自26/9以来≈3:

([rand(97..122)]*3 << rand(49..57)).sample.chr

可能是从一个包含两个随机数的数组中进行采样? 用于加权概率,自26/9以来≈3:

([rand(97..122)]*3 << rand(49..57)).sample.chr

[*97..122,*49..57]。样本?[*97..122,*49..57]。样本?…或'97'..'122'。到_a+'49'..'57'。到_a.样本。这样做的缺点是创建了两个被丢弃的临时数组。是的,但是@Michael需要chr方法,所以他需要整数…或'97'..'122'。到_a+'49'..'57'。到_a.sample。这有一个缺点:创建两个被丢弃的临时数组。是的,但是@米迦勒需要CHR方法,所以他需要整数如果你同意1是不正确的考虑只保留2。为准确起见:[*[rand97..122]*26,*[rand49..57]*10].sample.chr@CarySwoveland,删除了不正确的。但我应该避免创建35个数组。49..57应包含9个元素。你知道两个数字之间的随机数是否有不同的加权方法吗?也许在随机类本身?啊,是的,9。不,我不知道。如果你同意1是不正确的,只考虑2。为准确起见:[*[rand97..122]*26,*[rand49..57]*10].sample.chr@CarySwoveland,删除了不正确的。但我应该避免创建35个数组。49..57应包含9个元素。你知道两个数字之间的随机数是否有不同的加权方法吗?也许在随机类本身?啊,是的,9。不,我不知道。
rand(36).to_s(36)
([rand(97..122)]*3 << rand(49..57)).sample.chr