【问题标题】:Ruby - how to select one random character from two rangesRuby - 如何从两个范围中选择一个随机字符
【发布时间】:2019-07-17 17:48:19
【问题描述】:

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

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

【问题讨论】:

  • [*97..122, *49..57].sample ?

标签: ruby


【解决方案1】:

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

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

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

([*97..122] + [*49..57]).sample.chr

【讨论】:

  • ...或(('97'..'122').to_a + ('49'..'57').to_a).sample。这样做的缺点是创建了两个被丢弃的临时数组。
  • 是的,但是@Michael 想要#chr 方法,所以他需要Integer
【解决方案2】:

您可以通过条件采样来做到这一点:

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

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

【讨论】:

    【解决方案3】:

    避免创建数组的两种方法。

    #1

    rand(35).yield_self {|rn| rn + (rn < 10 ? 49 : 87)}.chr
    

    注意:

    35 = 57-48 + 122-96
    

    10 = 58-48
    

    #2¯\_(ツ)_/¯

    "0123456789abcdefghijklmnopqrstuvwxyz"[rand 36]
    

    【讨论】:

      【解决方案4】:

      数字 0-9 和所有字母,这就是数字以 36 为底的表示方式:

      rand(36).to_s(36)
      

      【讨论】:

        【解决方案5】:

        也许从包含从范围生成的两个随机数的数组中采样? 对于概率加权,因为 26/9≈3:

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

        【讨论】:

        • 如果您同意 #1 不正确,请考虑仅保留 #2。准确地说:[*[rand(97..122)]*26, *[rand(49..57)]*10].sample.chr.
        • @CarySwoveland,删除了不正确的。但我应该避免创建 35 个数组。(49..57) 应该包含 9 个元素。你知道是否有不同的方法来加权两个数字之间的随机性?也许在随机类本身?
        • 啊,是的,9。不,我不知道。
        猜你喜欢
        • 2012-02-03
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-08
        相关资源
        最近更新 更多