如何在Ruby中获取字符串的随机片段?

如何在Ruby中获取字符串的随机片段?,ruby,string,random,slice,Ruby,String,Random,Slice,如果我有一个字符串,比如'Lorem Ipsum',我需要一个方法,它返回字符串的随机部分,比如'remi','Lor',等等(更新:该方法不应返回空字符串)。到目前为止,我已经得出了以下结论: def random_slice string start = rand string.size - 2 finish = rand start + 1..string.size - 1 word[start..finish] end 有更好的选择吗?看看这个方法 如果传递了起始索引和长度

如果我有一个字符串,比如
'Lorem Ipsum'
,我需要一个方法,它返回字符串的随机部分,比如
'remi'
'Lor'
,等等(更新:该方法不应返回空字符串)。到目前为止,我已经得出了以下结论:

def random_slice string
  start = rand string.size - 2
  finish = rand start + 1..string.size - 1
  word[start..finish]
end
有更好的选择吗?

看看这个方法

如果传递了起始索引和长度,则返回包含 从索引开始的长度字符


您可以使用以下方法更简单地编写:

s[rand(s.length), rand(s.length - 1) + 1]

刚刚对被接受答案的随机性做了一个简单的基准:

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

  • 可能接受的答案正好满足要求,而且非常简单。

    可能返回空字符串。我不接受将其作为随机子字符串。对于
    s.slice(x,y)
    中的所有
    x>y
    ,它生成空字符串。这将导致所有结果中约1/3~1/2为空字符串。这只是为了说明如何使用该方法。我相信他足够聪明,能够弄清楚什么是好的情妇。@toro2k啊,我明白了。我在我的机器上做了一次糟糕的尝试,做出了错误的假设。谢谢您的指点。您也可以返回空字符串。@Monk\u代码-谢谢。修正了。你为什么改变答案?以前更好。@sawa-更改为第一个参数:对于字符串“12345678910”,以前的版本将永远不会返回“0”。更改为第二个参数-第二个参数不能为零,以防止返回空字符串。@sawa-实际上它也不返回任何1个字符长的字符串。我只是假设它不应该返回空字符串,但我同意问题中没有澄清它。
    str = "Lorem ipsum your text goes here"
    boundaries = [rand(str.size), rand(str.size)].sort
    p str[Range.new(*boundaries)] # => "rem ipsum your"
    
    str = "Lorem ipsum your text goes here"
    boundaries = [rand(str.size), rand(str.size)].sort
    p str[Range.new(*boundaries)] # => "rem ipsum your"