如何从数组中选取小数样本?

时间:2014-03-06 21:59:57

标签: ruby arrays sample

我知道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

有更好的方法吗?

2 个答案:

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