生成范围为a到z的数组,然后是aa到zz,然后是aaa到zzz,并从中选择任意随机字符

时间:2018-02-04 08:43:44

标签: arrays ruby

我想生成范围az然后aazz然后aaazzz的数组,然后选择任何随机字符。

假设有[a, b, c, .., z, aa, bb, .., zz, ..., aaa, bbb, ..., zzz]。我想从中选择任何随机字符,如rand(10)

我们可以生成类似('a'..'z')的范围,但我不知道如何实现上述目标。

7 个答案:

答案 0 :(得分:2)

请尝试以下

array = []

3.times do |i|
    array += ('a'..'z').collect { |e| e * (i+1)}
end

array.sample

答案 1 :(得分:2)

给定一系列字母r和范围m = 1..n,其中n是正整数(“最大倍数”),让S成为所有字母的集合形式为s*t的字符串,其中s位于rt位于m*为方法String#* 。然后随机抽取s*n中元素S的概率为

P[s in r and t in m] = P[s in r|t in m] * P[t in m]
                     = P[s in r] * P[t in m]
                     = (1/r.size) * (1/n)

P[s in r|t in m]被理解为“sr t mP[s in r|t in m] = P[s in r] s*t的概率。 s因为这两个事件是独立的。

因此,我们可以通过r中的tm中的def doit(rng, mult) rng.to_a.sample * rand(1..mult) end doit 'a'..'z', 3 # => "zz" doit 'a'..'z', 3 # => "eee" doit 'a'..'z', 3 # => "j" doit 'a'..'z', 3 # => "k" 绘制随机元素NSString来绘制随机元素substringWithRange:

consonants

答案 2 :(得分:2)

这有效:

(1..3).flat_map {|n| ('a'..'z').map { |char| char * n } }.sample

答案 3 :(得分:1)

对此我没有一个神奇的构造,我很害怕。但是通过组合更简单的更简单的ruby概念来获得你想要的东西并不是很难:范围,将范围转换为数组,map,通过乘法构建字符串,连接数组。看看:

one_letter = ('a'..'z').to_a # => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
two_letters = ('a'..'z').map { |c| c * 2 } # => ["aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "kk", "ll", "mm", "nn", "oo", "pp", "qq", "rr", "ss", "tt", "uu", "vv", "ww", "xx", "yy", "zz"]
three_letters = ('a'..'z').map { |c| c * 3 } # => ["aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj", "kkk", "lll", "mmm", "nnn", "ooo", "ppp", "qqq", "rrr", "sss", "ttt", "uuu", "vvv", "www", "xxx", "yyy", "zzz"]

combined = one_letter + two_letters + three_letters

random_element = combined.sample # => "pp"

答案 4 :(得分:0)

不是最好的,但这应该有效:

{{1}}

答案 5 :(得分:0)

friend

第一行创建数组,第二行从中获取示例。

答案 6 :(得分:-1)

生成一个低于26 ** 3的随机数,取其基数为26的数字,每个数字加97以获得ASCII值并形成一个字符串。

p rand(26**3).digits(26).map{|d| (d+97).chr}.join  # => "wfo"