如何在Ruby中随机切片?

时间:2014-03-26 09:44:48

标签: ruby string random slice

如果我有一个像'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

还有更好的选择吗?

4 个答案:

答案 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生成实际随机值)。

更随机的是:

  1. 将所有可能的子字符串生成到数组中,如this question中所述。
  2. 致电Array#sample。您可以缓存第一步的结果,并多次执行第2步。
  3. 也许接受的答案符合要求,而且非常简单。

答案 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"