我知道ruby有myarray.sample(i)
来从数组中抽取i
个元素。我的问题是元素的数量不是整数。
即我想要一个方法mysample
,如果我拨打myarray.mysample(1.5)
10次,我得到的元素数量应接近15。
使用sample
,我将获得10或20,具体取决于int转换。同样,如果我调用myarray.mysample(.25)
,我希望它返回一个0.25
概率的元素(也就是说,它应该从四个中返回一个元素,四个中的三个,它应该返回一个空数组/无)。
我该怎么做?
到目前为止我的尝试:
def mysample(array,s)
ints = array.sample(s.floor)
if (Random.rand > s - s.floor)
ints << array.sample
end
return ints
end
有更好的方法吗?
答案 0 :(得分:1)
基于此我的答案:
如果我拨打
myarray.mysample(1.5)
10次,我获得的元素数量应该接近15。
扩展Array
会产生以下结果:
class Array
def mysample(num)
self.sample( ( num + rand() ).floor )
end
end
> [1, 2, 3, 4, 5].mysample(2.5)
=> [1, 3]
> [1, 2, 3, 4, 5].mysample(2.5)
=> [4, 2, 5]
> [1, 2, 3, 4, 5].mysample(0.5)
=> []
> [1, 2, 3, 4, 5].mysample(0.5)
=> [3]
etc.
答案 1 :(得分:1)
要获得最佳参数,可以决定数字大于1的随机性的扩散。
class Array
def my_sample(number, deviation=0.3)
if number < 1
return sample rand(100) < number * 100 ? 1 : 0
end
speard = (number*deviation).to_i
randomness = rand(-speard..speard)
sample(number+randomness)
end
end
p [1,2,3,4,5,6,7,8,9,10].my_sample(0.5) #=> []
p [1,2,3,4,5,6,7,8,9,10].my_sample(0.5) #=> [3]
p [1,2,3,4,5,6,7,8,9,10].my_sample(5) #=> [9, 2, 1, 4, 10, 7, 3]
p [1,2,3,4,5,6,7,8,9,10].my_sample(5) #=> [7, 2, 3, 8]