Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+的行为+';s std::R中离散分布与样本()的比较_C++_Random_Statistics_Std_Distribution - Fatal编程技术网

C++ C+的行为+';s std::R中离散分布与样本()的比较

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

我想从一组频率中画一个数字,直到所有的值都为零。通过绘图,剩余数字的频率正在减少。在R中,有一个“简单”的函数示例可以为我实现这一点。在C++中,我找到了STD::DeutiTyx分布,但没有太多关于它的细节信息

  • 我找不到对R算法和/或std::discrete_分布的清晰描述来比较功能。这种行为是一样的吗?用C++的STDL?< /LI>可以解决我的任务吗?
  • 当我对其他PRNG的非STDL进行编程时——需要它们的哪些功能才能与std::discrete_distribution一起使用——CPPFerence和其他网站/论坛对此保持沉默
  • 在代码的第二个地方,我需要一个类似的行为(每次绘制的频率固定),我没有发现一个明确的额外调用或参数来分离这两个功能。我需要创建一个参数更低的新实例吗?!这显然是一件我无法相信的事情
  • 实际上,我将频率相加(由std::vector保持),直到随机数小于或等于。因为这是:

    • 在时间/资源上无效
    • 我不确定这在统计上是否被允许
    我希望在你的帮助下找到更好的解决办法

    感谢您的时间、支持和回答:)

    C++17为我们提供了以下功能:

    #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;
    }