ruby - 生成具有加权概率的随机数 - 'Distribution' gem

标签 ruby probability distribution

我想创建一个随机数生成器,它生成一个随机十进制数:

  • 大于 0.0
  • 低于 15.0
  • 该数字接近 2.0 的概率相对较高
  • 接近 15.0 或非常接近于 0 的概率非常低

我的数学非常差,但我的研究似乎告诉我,我想从类似于 Fisher–Snedecor (F) 模式的累积分布函数中提取一个随机数,有点像这样:

http://cdn.app.compendium.com/uploads/user/458939f4-fe08-4dbc-b271-efca0f5a2682/742d7708-efd3-492c-abff-6044d78e3bbd/Image/6303a2314437d8fcf2f72d9a56b1293a/f_distribution_probability.png

我正在使用名为 Distribution ( https://github.com/sciruby/distribution ) 的 Ruby gem 来尝试实现此目标。它看起来是正确的工具,但我在尝试了解如何使用它来实现预期结果时遇到了困难:(请提供任何帮助。

最佳答案

我收回这句话,F 没有 rng 调用。因此,如果您想使用 Distribution gem,我建议使用具有 4 个自由度的 Chi2

具有 k 自由度的 Chi2 模式等于 k-2,因此对于 4 d.f.您将获得众数 2,请参阅 here 。我的 ruby 生锈了,请耐心等待

require 'distribution'
normal = Distribution::Normal.rng(0)

g1 = normal.call
g2 = normal.call
g3 = normal.call
g4 = normal.call

chi2 = g1*g1 + g2*g2 + g3*g3 + g4*g4

更新

您必须将其截断为 15,因此如果生成的 chi2 大于 15,则拒绝它并生成另一个。虽然我想说你不会看到很多 值高于 15,请检查 PDF/CDF 图表。

更新二

如果您想从 F 获取样本,请从上面的代码中制作具有 d 自由度的通用 Chi2 生成器,然后就可以了chi2的样本比例,查看here

chi2_d1 = DChi2(d1)
chi2_d2 = DChi2(d2)

f = (chi2_d1.call / d1) / (chi2_d2.call / d2)

更新三

而且,坦率地说,我不知道如何让 F 发行版为您工作。 0 没问题,但是 mode 等于 (d1-2)/d1 * d2/(d2 + 2),很难看出它等于2.您提供的图表的众数约为1/3。

关于ruby - 生成具有加权概率的随机数 - 'Distribution' gem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38554772/

相关文章:

ruby - Ruby 的 "hello world"中的对象是什么?

ios - 向选定客户分发 iOS 应用程序

mysql - rails 2.3 : Replace record associations instead of delete

ruby-on-rails - 日志在生产中无法正常工作,作业延迟

xml - 如何在 ruby​​ 中进行 XMLRPC::Client 的有线转储?

matlab - 从正态分布中选择的随机变量出现的概率

根据权重分配的算法,在项目总数未知的情况下,保证良好的分配?

sql-server-2005 - 预测某个时间点的游戏结果

julia - 在 Julia 中估计概率分布并从中采样

r - fBasics::fitStable 工作可疑