boost::random::discrete_distribution是否可动态调整大小
Is boost::random::discrete_distribution dynamically resizable?
我找不到很多关于discrete_distribution的Boost版本的文档。经过大量的谷歌搜索,我甚至找不到这个类的方法列表,也找不到其中是否有任何方法可以重新分配概率。
就我而言,我正在写一个进化动力学算法。在每个时间步长,可以随机选择种群成员死亡或繁殖。正因为如此,我的离散分布中的条目总数几乎每次迭代都会发生变化。
我想在模拟开始前定义一个对象,称为gillespie_dist
(控制Gillespie算法的离散分布)。但我希望在每次迭代结束时,潜在地更改特定值和/或向gillespie_dist
添加新值,特别是不希望在每次重复时创建离散分布的新实例。
什么是一个好的方法。有没有将新值推送到discrete_distribution
对象上的方法,有没有在特定索引处更改分布值的方法,或者更好的是,使用这里提到的向量迭代器思想以某种方式"重新初始化"整个分布?
我研究了std::discrete_distribution的gcc-libstdc++4.7实现的代码。
权重作为vector<double>
存储在私人成员中。在公共界面中无法访问其resize方法。
我将尝试挖掘它的运算符()的实现(它看起来像是在cpp中),推出自己的应该没有问题。
以下是主要动作,我的解释如下:
template<typename _IntType>
void
discrete_distribution<_IntType>::param_type::
_M_initialize()
{
if (_M_prob.size() < 2)
{
_M_prob.clear();
return;
}
const double __sum = std::accumulate(_M_prob.begin(),
_M_prob.end(), 0.0);
// Now normalize the probabilites.
__detail::__transform(_M_prob.begin(), _M_prob.end(), _M_prob.begin(),
std::bind2nd(std::divides<double>(), __sum));
// Accumulate partial sums.
_M_cp.reserve(_M_prob.size());
std::partial_sum(_M_prob.begin(), _M_prob.end(),
std::back_inserter(_M_cp));
// Make sure the last cumulative probability is one.
_M_cp[_M_cp.size() - 1] = 1.0;
}
template<typename _IntType>
template<typename _UniformRandomNumberGenerator>
typename discrete_distribution<_IntType>::result_type
discrete_distribution<_IntType>::
operator()(_UniformRandomNumberGenerator& __urng,
const param_type& __param)
{
if (__param._M_cp.empty())
return result_type(0);
__detail::_Adaptor<_UniformRandomNumberGenerator, double>
__aurng(__urng);
const double __p = __aurng();
auto __pos = std::lower_bound(__param._M_cp.begin(),
__param._M_cp.end(), __p);
return __pos - __param._M_cp.begin();
}
因此,它基本上计算了初始化时的辅助向量_M_cp
,它本质上是权重的累积密度函数。因此,生成一个样本只意味着生成一个均匀随机变量,并搜索累积分布中第一个出现的变量(这是上面的下界调用),返回其索引。
例如,如果权重向量为:
{ 1, 2, 1, 3 }
则cp计算为:
{ 1, 1+2, 1+2+1, 1+2+1+3 }
=
{ 1, 3, 4, 7 }
所以我一致地从0..6中选择,得到4,所以我选择第三个。
经过多次谷歌搜索,我仍然找不到方法列表该类具有的,以及它们中是否有任何一个用于重新分配概率。
http://www.boost.org/doc/html/boost/random/discrete_distribution.html
和
void param(const param_type & param);
设置分布的参数。
- 将动态分配的数组的大小调整为较小的大小C++
- 我的C++程序有问题.涉及动态调整整数数组的大小
- 通过新的后传递后创建的动态数组的错误以调整函数
- 根据内容动态调整 qwidget 和 qlayout 的大小
- Qt:如何调整QGraphicsItem以动态更改大小
- 调整动态数组大小时保留用户输入的值的问题
- 动态调整大小并填充C++中的矢量
- 如何在C++中实现可动态调整大小的堆栈
- 动态调整大小的不可调整大小的数组
- C++中数组的动态调整大小
- 根据文本动态调整控件大小
- 如何使用动态调整大小的字符串数组
- 动态调整组合框的宽度,以便可以显示整个字符串
- boost::random::discrete_distribution是否可动态调整大小
- 在QGraphicScene中动态调整视频大小
- 可动态调整大小的字符串数组C++类
- 如何动态调整QLabel/QVBoxLayout/QWidget中使用的QImage的大小
- 如何使提升::无锁::队列动态调整大小
- 如何动态调整二维矢量的大小
- 需要传递一个二维数组,但必须动态调整大小