如果我有一个像'Lorem Ipsum'
这样的字符串,我需要一个方法,它返回字符串的随机部分,如'rem I'
,'Lor'
等。( UPDATE < / strong>:该方法不应返回空字符串)。到目前为止,我已经想出了这个:
def random_slice string
start = rand string.size - 2
finish = rand start + 1..string.size - 1
word[start..finish]
end
还有更好的选择吗?
答案 0 :(得分:6)
您可以使用以下方法更简单地编写:
s[rand(s.length), rand(s.length - 1) + 1]
答案 1 :(得分:4)
查看String#slice方法。
s = 'Lorem Ipsum'
s.slice(rand(s.size), rand(s.size) + 1)
=> "orem Ip"
如果传递了一个起始索引和一个长度,则返回一个包含的子字符串 从索引开始的长度字符。
答案 2 :(得分:2)
刚刚对接受答案的随机性做了一个简单的基准:
s = "0123456789"
count = Hash.new(0)
SAMPLE_SIZE = 5000000
SAMPLE_SIZE.times do
sub = s[rand(s.length), rand(s.length - 1) + 1]
count[sub] += 1
end
count.sort_by{|k,v| -v}.each do |k, v|
puts "#{k.ljust(10)} #{v.to_f*100/SAMPLE_SIZE}%"
end
结果是:
9 9.9888%
89 8.87602%
789 7.79196%
6789 6.66138%
56789 5.5665%
456789 4.45512%
3456789 3.32218%
23456789 2.2117%
23456 1.12276%
123456789 1.1204%
... # all about 1% for the others
它通常不是随机解决方案。我们可以证明实际结果遵循这一趋势(假设rand
生成实际随机值)。
更随机的是:
Array#sample
。您可以缓存第一步的结果,并多次执行第2步。也许接受的答案符合要求,而且非常简单。
答案 3 :(得分:2)
str = "Lorem ipsum your text goes here"
boundaries = [rand(str.size), rand(str.size)].sort
p str[Range.new(*boundaries)] # => "rem ipsum your"