如题... 效果是 1-10 之间的占比 80% 10-20 之间的占比 20%
不过有个问题,a.map!{|x,i| x*2}如何用到前一个元素?这个只能用当前元素和当前 index。
#4 楼 @michael0015 恩,这个我自己写了。不过有个问题,a.map!{|x,i| x*2}如何用到前一个元素?这个只能用当前元素和当前 index。
思路
x = Random.rand(1..100)
if (1..80).include? x
return Random.rand(1..10)
elsif (81..100).include? x
return Random.rand(10..20)
end
#9 楼 @cassiuschen 这种解决办法的话 整数 10 只有在随机到 40 的时候才能实现,那么显然整数 10 的出现概率明显比 1-10 中其它的数低很多啊,或者修改为 1-43 直接除以 4,而 44-54 直接减去 33。
((1..10).to_a * 4 + (11..20).to_a).shuffle.pop
#16 楼 @imconfused 用 shuffle 效率太低了:
require 'benchmark'
class A
def shuffle_or_sample(a =0)
Benchmark.bm do |x|
arr = (1..a).to_a
x.report("shuffle") do
a.times do |i|
arr.shuffle.pop
end
end
x.report("sample") do
a.times do |i|
arr.sample(1).first
end
end
end
end
end
A.new.stuffle_or_sample(10000) 的结果:
shuffle 3.600000 0.030000 3.630000 ( 3.651668)
sample 0.000000 0.000000 0.000000 ( 0.003996)
A.new.stuffle_or_sample(50000) 的结果:
shuffle 256.740000 3.160000 259.900000 (262.763773)
sample 0.020000 0.000000 0.020000 ( 0.018795)