C++ C+的行为+';s std::R中离散分布与样本()的比较
我想从一组频率中画一个数字,直到所有的值都为零。通过绘图,剩余数字的频率正在减少。在R中,有一个“简单”的函数示例可以为我实现这一点。在C++中,我找到了STD::DeutiTyx分布,但没有太多关于它的细节信息C++ C+的行为+';s std::R中离散分布与样本()的比较,c++,random,statistics,std,distribution,C++,Random,Statistics,Std,Distribution,我想从一组频率中画一个数字,直到所有的值都为零。通过绘图,剩余数字的频率正在减少。在R中,有一个“简单”的函数示例可以为我实现这一点。在C++中,我找到了STD::DeutiTyx分布,但没有太多关于它的细节信息 我找不到对R算法和/或std::discrete_分布的清晰描述来比较功能。这种行为是一样的吗?用C++的STDL?< /LI>可以解决我的任务吗? 当我对其他PRNG的非STDL进行编程时——需要它们的哪些功能才能与std::discrete_distribution一起使用——CP
- 在时间/资源上无效
- 我不确定这在统计上是否被允许
#include <iostream>
#include <random>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
std::string in = "abcdefgh";
std::string out;
std::sample(in.begin(), in.end(),
std::back_inserter(out),
5,
std::mt19937{std::random_device{}()} //(*)
);
std::cout << "five random letters out of " << in << " : " << out << '\n';
}
#包括
#包括
#包括
#包括
#include包含一个示例实现(使用统一分布):
//主函数,它根据所用容器中迭代器的类型调用详细函数。
模板
取样口样品(先取样口、后取样口、后取样口、尺寸n、瓮和g)
{
使用pop\u t=typename std::iterator\u traits::iterator\u category;
使用samp\u t=typename std::iterator\u traits::iterator\u category;
返回{u样本(第一个、最后一个、弹出、输出、samp{u}、n、前进(g));
}
模板
采样仪-采样仪(首先是PopIter,
波比特最后,
std::input_iterator_标记,
采样仪输出,
std::随机访问迭代器标记,
尺寸n,
瓮(瓮和瓮)
{
使用dist_t=std::uniform_int_分布;
使用param_t=typename dist_t::param_type;
距离{};
大小样本_sz{0};
while(first!=last&&sample_sz!=n)
out[sample_sz++]=*first++;
对于(大小pop_sz{sample_sz};first!=last;++first,++pop_sz)
{
参数常数p{0,pop_sz};
大小常数k{d(g,p)};
if(k
采样仪-采样仪(首先是PopIter,
波比特最后,
std::forward_迭代器_标记,
采样仪输出,
std::output_iterator_标记,
尺寸n,
瓮(瓮和瓮)
{
使用dist_t=std::uniform_int_分布;
使用param_t=typename dist_t::param_type;
距离{};
未取样尺寸_sz=标准::距离(第一个,最后一个);
对于(n=min(n,未采样);n!=0;++first)
{
参数常数p{0,-unsampled_sz};
if(d(g,p)
你能举一个具体的例子说明你想做什么吗?我一点也不确定我是否理解你目前的问题。如果我理解的话,我想知道为什么你不只是洗牌,然后在洗牌的集合中迭代。你检查过这个吗:?您缺少什么?这是(草案)标准对该函数的说明:关于第2点,discrete_distribution的operator()上的cppreference页面说明了RNG必须做什么(带有可单击的链接)Hello,当然!;)对于第一种情况(绘制而不放回),这是一个选项-转向哪个算法进行洗牌,结果可能不如从随机性中绘制好。对于第二种情况,从概率中提取,没有其他机会(据我所知)从分布中提取。主要问题与std::discrete_distribution的功能有关-例如,with functionality从Prng内部调用,因此我的Prng必须具备哪些功能。这东西是怎么工作的?我试图在stdl中芦苇,但对我的朋友来说,还有什么比这更神秘的呢knowledge@prometheus你明白吗?
// the primary function, which calls the detailed functions depending on types of iterators in the used containers.
template< class PopIter, class SampleIter, class Size, class URNG >
SampleIter sample( PopIter first, PopIter last, SampleIter out, Size n, URNG&& g )
{
using pop_t = typename std::iterator_traits< PopIter >::iterator_category;
using samp_t = typename std::iterator_traits< SampleIter >::iterator_category;
return __sample( first, last, pop_t{}, out, samp_t{}, n, forward< URNG >( g ) );
}
template< class PopIter, class SampleIter, class Size, class URNG >
SampleIter __sample( PopIter first,
PopIter last,
std::input_iterator_tag,
SampleIter out,
std::random_access_iterator_tag,
Size n,
URNG&& g )
{
using dist_t = std::uniform_int_distribution< Size >;
using param_t = typename dist_t::param_type;
dist_t d{};
Size sample_sz{0};
while ( first != last && sample_sz != n )
out[ sample_sz++ ] = *first++;
for ( Size pop_sz{sample_sz}; first != last; ++first, ++pop_sz )
{
param_t const p{0, pop_sz};
Size const k{d( g, p )};
if ( k < n )
out[ k ] = *first;
}
return out + sample_sz;
}
template< class PopIter, class SampleIter, class Size, class URNG >
SampleIter __sample( PopIter first,
PopIter last,
std::forward_iterator_tag,
SampleIter out,
std::output_iterator_tag,
Size n,
URNG&& g )
{
using dist_t = std::uniform_int_distribution< Size >;
using param_t = typename dist_t::param_type;
dist_t d{};
Size unsampled_sz = std::distance( first, last );
for ( n = min( n, unsampled_sz ); n != 0; ++first )
{
param_t const p{0, --unsampled_sz};
if ( d( g, p ) < n )
{
*out++ = *first;
--n;
}
}
return out;
}