具有相同模式的随机字符串生成

时间:2014-06-04 11:45:01

标签: ruby random

我想生成一个带有模式的随机字符串:

number-number-letter-SPACE-letter-number-number

例如"81b t15""12a x13"。我怎样才能生成这样的东西?我尝试生成每个char并将它们连接成一个字符串,但它看起来效率不高。

4 个答案:

答案 0 :(得分:4)

Nums = (0..9).to_a
Ltrs = ("A".."Z").to_a + ("a".."z").to_a
def rand_num; Nums.sample end
def rand_ltr; Ltrs.sample end

"#{rand_num}#{rand_num}#{rand_ltr} #{rand_ltr}#{rand_num}#{rand_num}"
# => "71P v33"

答案 1 :(得分:3)

你看过randexp gem

吗?

它的工作原理如下:

> /\d\d\w \w\d\d/.gen
=> "64M c82"

答案 2 :(得分:1)

好的,这是比赛的另一个参赛作品:D

module RandomString
  LETTERS      = (("A".."Z").to_a + ("a".."z").to_a)
  LETTERS_SIZE = LETTERS.size
  SPACE        = " "
  FORMAT       = [:number, :letter, :number, :space, :letter, :number, :number]

  class << self
    def generate
      chars.join
    end

    def generate2
      "#{number}#{letter}#{number} #{letter}#{number}#{number}"
    end

    private

    def chars
      FORMAT.collect{|char_class| send char_class}
    end

    def letter
      LETTERS[rand(LETTERS_SIZE)]
    end

    def number
      rand 10
    end

    def space
      SPACE
    end
  end
end

你用它就像:

50.times { puts RandomString.generate }

出于好奇,我对这里提出的所有解决方案进行了基准测试。结果如下:

<强> JRuby的:

       user     system      total        real
kimmmo   1.490000   0.000000   1.490000 (  0.990000)
kimmmo2  0.600000   0.010000   0.610000 (  0.479000)
sawa     0.960000   0.040000   1.000000 (  0.533000)
hp4k     2.050000   0.230000   2.280000 (  1.234000)
brian   17.700000   0.170000  17.870000 ( 14.867000)

MRI 2.0

       user     system      total        real
kimmmo   0.900000   0.000000   0.900000 (  0.908601)
kimmmo2  0.410000   0.000000   0.410000 (  0.406443)
sawa     0.570000   0.000000   0.570000 (  0.568935)
hp4k     4.940000   0.000000   4.940000 (  4.945404)
brian   25.860000   0.010000  25.870000 ( 25.870011)

答案 3 :(得分:0)

你可以这样做

(0..9).to_a.sample(2).join + ('a'..'z').to_a.sample + " " + ('a'..'z').to_a.sample + (0..9).to_a.sample(2).join