生成适合Ruby中概率分布的数字数组?

假设我有100条记录,我想模拟created_at日期,以便它适合某些曲线。 有没有图书馆可以做到这一点,或者我可以使用什么公式? 我认为这是沿着同样的轨道:

用概率分布生成随机数

我不太了解它们是如何归类于数学的,但我看的是:

  • 钟形曲线
  • 对数(典型的生物学/进化)曲线? …

只是在代码中寻找一些公式,所以我可以这样说:

  • 给出100条记录,1周的时间跨度,以及12 12.hours的间隔
  • 为每条记录设置created_at ,使其大致适合curve

非常感谢!

更新

我发现这个关于ruby算法的论坛post ,这让我看到了rruby ,一个R / Ruby桥,但这看起来太多了。

更新2

我写了这个小片段试用了gsl库,到了那里……

在Rails中生成测试数据,其中created_at沿统计分布

您可以生成实际上只是整数的UNIX时间戳。 首先找出你想要开始的时间,例如现在:

 start = DateTime::now().to_time.to_i 

找出你的间隔结束的时间(比如1周之后):

 finish = (DateTime::now()+1.week).to_time.to_i 

Ruby使用此算法生成随机数。 它几乎是统一的。 然后在两者之间生成随机数:

 r = Random.new.rand(start..finish) 

然后将其转换回日期:

 d = Time.at(r) 

这看起来也很有希望: http : //rb-gsl.rubyforge.org/files/rdoc/randist_rdoc.html

这也是: http : //rb-gsl.rubyforge.org/files/rdoc/rng_rdoc.html

我最近遇到了一个rubygem,它的目的是根据各种统计分布生成数字。

我还没试过,但听起来很有希望。

来自维基 :

有几种方法可以根据概率密度函数生成随机数。 这些方法涉及以某种方式转换均匀随机数。 因此,这些方法在生成伪随机数和真随机数方面同样有效。

一种称为反演方法的方法涉及积分到大于或等于随机数的区域(对于正确的分布,应该在0和1之间生成)。

第二种方法称为接受拒绝方法 ,涉及选择x和y值并测试x的函数是否大于y值。 如果是,则接受x值。 否则,x值被拒绝,算法再次尝试。

第一种方法是您在SO链接问题中接受的答案中使用的方法: 使用概率分布生成随机数

另一种选择是SciRuby下的Distribution gem。 您可以通过以下方式生成正常数

 require 'distribution' rng = Distribution::Normal.rng random_numbers = Array.new(100).map { rng.call } 

还有用于各种其他分布的RNG。

Interesting Posts