我想生成范围a
到z
然后aa
到zz
然后aaa
到zzz
的数组,然后选择任何随机字符。
假设有[a, b, c, .., z, aa, bb, .., zz, ..., aaa, bbb, ..., zzz]
。我想从中选择任何随机字符,如rand(10)
。
我们可以生成类似('a'..'z')
的范围,但我不知道如何实现上述目标。
答案 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
位于r
且t
位于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]
被理解为“s
中r
t
m
中P[s in r|t in m] = P[s in r]
s*t
的概率。 s
因为这两个事件是独立的。
因此,我们可以通过r
中的t
和m
中的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"