#include <stdio.h>
#include <stdint.h>
#include <ctime>
#include <vector>
#include <map>

template<typename T>
T *RandomSelect(const std::vector<T*> &itemPtrs);
uint32_t Random(uint32_t range);
uint32_t Random2(uint32_t range);

template<typename T>
T * RandomSelect(const std::vector<T*> &itemPtrs)
{
    if (itemPtrs.empty()){ return NULL; }
    uint32_t factor = ;
    std::vector<uint32_t> totalProbs;
    totalProbs.resize(itemPtrs.size());
    totalProbs[] = itemPtrs[]->Prob() * factor;
    ; i < itemPtrs.size(); ++i)
    {
        totalProbs[i] = totalProbs[i - ] + itemPtrs[i]->Prob() * factor;
    }
    uint32_t randInt = Random(totalProbs[totalProbs.size() - ]);
    ; i < totalProbs.size(); ++i)
    {
        if (randInt < totalProbs[i])
        {
            return itemPtrs[i];
        }
    }
    return NULL;
}

uint32_t Random(uint32_t range)
{
    ){ ; }
    return uint32_t((double)rand() / RAND_MAX * range) % range;
}

uint32_t Random2(uint32_t range)
{
    ){ ; }
    uint32_t rand1 = Random();
    uint32_t rand2 = Random();
    uint32_t rand3 = Random();
    uint32_t rand4 = Random();
    uint32_t num = (rand4 << ) | (rand3 << ) | (rand2 << ) | rand1;
    return uint32_t(double(num) / 0xFFFFFFFF * range) % range;
}

struct Item
{
    int32_t prob;
    Item(int32_t p) :prob(p){}
    int32_t Prob(){ return prob; }
};

int32_t main()
{
    std::map<Item*, int32_t> statistic;
    ;
    Item arrItem[] = { , , , , , , , , , ,  };
    std::vector<Item*> vecProbs;
    float sum = 0.0;
    ; j < ]); ++j)
    {
        sum += arrItem[j].Prob();
        vecProbs.push_back(&arrItem[j]);
    }
    ; i < loop; ++i)
    {
        Item *ret = RandomSelect(vecProbs);
        if (ret)
        {
            //printf("%d\n", ret->Prob());
            statistic[ret] += ;
        }
    }
    printf("statistic size = %u\n", statistic.size());
    double error = 0.0;
    for (const std::pair<Item*, int32_t> &p : statistic)
    {
        printf("%-8d %-8d %-12f %-12f\n", p.first->Prob(), p.second, (double)p.second / loop * 100.0, p.first->Prob() / sum * 100.0);
        error += fabs((double)p.second / loop * 100.0 - p.first->Prob() / sum * 100.0);
    }
    printf("error = %f\n", error);
    getchar();
    ;
}

事实证明,Random2要比Random的随机误差略小一点点,多随机几次还是有好处的.

C++ 从一组数据中按概率选择一个的更多相关文章

  1. C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)

    原文:C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值) 1.问题的提出: 电池生产中,遇到一批电池的测量结果数据: 电压值 电池个数 电压值 电池个数 电压值 电池个数 电 ...

  2. 工作 巧遇 sql 查询 一组数据中 最新的一条

    SELECT * FROM rsl a, (SELECT CODE, max(time_key) time_key FROM rsl GROUP BY CODE ) b WHERE a. CODE = ...

  3. 获取mysql一组数据中的第N大的值

    create table tb(name varchar(10),val int,memo varchar(20)) insert into tb values('a', 2, 'a2') inser ...

  4. [SQL]一组数据中Name列相同值的最大Je与最小je的差

    declare @t table(name varchar(),qy varchar(),je int) insert into @t union all union all union all un ...

  5. c语言:从一组数据中选出可以组成三角形并且周长最长的三个数(简单)

    题目如下: 思路分析: 写出完整的程序: /* 问题描述: 有n根棍子,棍子i的长度为ai.想要从中选出3根棍子组成周长尽可能长的三角形.请输 出最大的周长,若无法组成三角形则输出0. */ #inc ...

  6. 【剑指offer】求一组数据中最小的K个数

    题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *知识点:Java PriorityQueue 调整新插入元素 转自h ...

  7. oracle数据中记录被另一个用户锁住

    原因:PL/SQL里面执行语句执行了很久都没有结果,于是中断执行,于是就直接在上面改字段,在点打钩(记入改变)的时候提示,记录被另一个用户锁住. 解决方法: 第一步:(只是用于查看哪些表被锁住,真正有 ...

  8. 在MySQL中,如何计算一组数据的中位数?

    要得到一组数据的中位数(例如某个地区或某家公司的收入中位数),我们首先要将这一任务细分为3个小任务: 将数据排序,并给每一行数据给出其在所有数据中的排名. 找出中位数的排名数字. 找出中间排名对应的值 ...

  9. 在django中如何从零开始搭建一个mock服务

    mock概念 mock 就是模拟接口返回的一系列数据,用自定义的数据替换接口实际需要返回的数据,通过自定义的数据来实现对下级接口模块的测试.这里分为两类测试:一类是前端对接口的mock,一类是后端单元 ...

随机推荐

  1. LeetCode 219 Contains Duplicate II

    Problem: Given an array of integers and an integer k, find out whether there are two distinct indice ...

  2. SQL语句汇总

    1.查询出来数据保留小数点2位,并且0.01时候,不会展示为.01. select     to_char(0.1,'fm9999999990.00') from dual; 2.wm_concat ...

  3. C#学习笔记---Dispose(),Finalize(),SuppressFinalize

    http://www.cnblogs.com/eddyshn/archive/2009/08/19/1549961.html 在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Fina ...

  4. Web开发基本准则-55实录-缓存策略

    续上篇<Web开发基本准则-55实录-Web访问安全>. Web开发基本准则-55实录-缓存策略 郑昀 创建于2013年2月 郑昀 最后更新于2013年10月26日 提纲: Web访问安全 ...

  5. [Unity3D]Unity+Android交互教程——让手机"动"起来

    想要用Unity实现一个二维码扫描的功能,然后网上找插件,找到一个貌似叫EasyCodeScanner,但下载下来用用,真不好使,一导入运行就报错,调好错了再运行发现点按钮没反应,反复试了几遍发现还是 ...

  6. Asp.net导出Excel续章(自定义合并单元格,非Office组件)

    结合上次写的导出Excel方法,这次上头要求我将列头进行一下合并 以前的效果: 改进后的效果: 在上篇文章中写到了Excel的导出方法,这次为了避免在生产环境中使用Office组件,服务器各种权限配置 ...

  7. ByteBuf和相关辅助类

    当我们进行数据传输的时候,往往需要使用到缓冲区,常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer. 实际上,7种基础类型(Boolean除外)都有自己的缓冲区实现,对于NIO编程 ...

  8. Webkit 文字和背景效果

    -webkit-background-clip:padding-box | border-box | content-box | text,指定对象的背景图像向外裁剪的区域.对应的脚本特性为backg ...

  9. event

    当一个事件被调用后,它会收到一个参数,第一个参数就是事件对象,事件对象包含type, target, timestamp三个. 类型:事件的名称,例如:点击目标:事件的目标元素时间戳:事件触发的时间

  10. SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...