2

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

生成具有概率分布的随机数

我不太了解它们在数学中的分类方式,但我正在研究以下内容:

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

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

  • 给定 100 条记录,时间跨度为1.week,时间间隔为12.hours
  • 为每个记录设置created_at,使其大致适合curve

非常感谢!

更新

我发现了这个关于 ruby​​ 算法的论坛帖子,这让我找到了rsruby,一个 R/Ruby 桥,但这似乎太多了。

更新 2

我写了这个小片段尝试gsl图书馆,到达那里......

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

4

4 回答 4

4

我最近遇到了croupier,这是一个红宝石宝石,旨在根据各种统计分布生成数字。

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

于 2012-09-27T07:18:03.857 回答
3

您可以生成实际上只是整数的 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

于 2010-12-29T01:06:42.483 回答
0

来自维基

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

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

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

第一种方法是在您的 SO 链接问题中接受的答案中使用的方法:Generate Random Numbers with Probabilistic Distribution

于 2010-12-29T01:06:56.977 回答
0

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

require 'distribution'

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

还有各种其他发行版的 RNG。

于 2015-05-28T21:26:01.853 回答