如何在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"