我想创建一个随机数生成器,它生成一个随机十进制数:
- 大于 0.0
- 低于 15.0
- 该数字接近 2.0 的概率相对较高
- 接近 15.0 或非常接近于 0 的概率非常低
我的数学非常差,但我的研究似乎告诉我,我想从类似于 Fisher–Snedecor (F) 模式的累积分布函数中提取一个随机数,有点像这样:
我正在使用名为 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/