C++ 从一组数据中按概率选择一个
#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++ 从一组数据中按概率选择一个的更多相关文章
- C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)
原文:C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值) 1.问题的提出: 电池生产中,遇到一批电池的测量结果数据: 电压值 电池个数 电压值 电池个数 电压值 电池个数 电 ...
- 工作 巧遇 sql 查询 一组数据中 最新的一条
SELECT * FROM rsl a, (SELECT CODE, max(time_key) time_key FROM rsl GROUP BY CODE ) b WHERE a. CODE = ...
- 获取mysql一组数据中的第N大的值
create table tb(name varchar(10),val int,memo varchar(20)) insert into tb values('a', 2, 'a2') inser ...
- [SQL]一组数据中Name列相同值的最大Je与最小je的差
declare @t table(name varchar(),qy varchar(),je int) insert into @t union all union all union all un ...
- c语言:从一组数据中选出可以组成三角形并且周长最长的三个数(简单)
题目如下: 思路分析: 写出完整的程序: /* 问题描述: 有n根棍子,棍子i的长度为ai.想要从中选出3根棍子组成周长尽可能长的三角形.请输 出最大的周长,若无法组成三角形则输出0. */ #inc ...
- 【剑指offer】求一组数据中最小的K个数
题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *知识点:Java PriorityQueue 调整新插入元素 转自h ...
- oracle数据中记录被另一个用户锁住
原因:PL/SQL里面执行语句执行了很久都没有结果,于是中断执行,于是就直接在上面改字段,在点打钩(记入改变)的时候提示,记录被另一个用户锁住. 解决方法: 第一步:(只是用于查看哪些表被锁住,真正有 ...
- 在MySQL中,如何计算一组数据的中位数?
要得到一组数据的中位数(例如某个地区或某家公司的收入中位数),我们首先要将这一任务细分为3个小任务: 将数据排序,并给每一行数据给出其在所有数据中的排名. 找出中位数的排名数字. 找出中间排名对应的值 ...
- 在django中如何从零开始搭建一个mock服务
mock概念 mock 就是模拟接口返回的一系列数据,用自定义的数据替换接口实际需要返回的数据,通过自定义的数据来实现对下级接口模块的测试.这里分为两类测试:一类是前端对接口的mock,一类是后端单元 ...
随机推荐
- 在linux中减小和增大LV的过程与思考
今天在安装oracle 11 rac的时候,查看操作系统df -lh,发现/home目录竟然分了500多G,/根目录才有50G,当时我就爆了句粗口,这TM系统是怎么做的. Filesystem ...
- 开发微信App支付
1.首先到官方下载Demo,地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 下载后的目录结构如下:
- Java基础之集合与泛型
话不多说,直接上图 1.Collection集合小结 注意: 凡是使用哈希表保存对象的容器,保存的对象在容器中都是唯一的,唯一性是通过被保存对象的hashCode和equals方法共同确定: 凡是使用 ...
- c语言for循环
#include<stdio.h>#include<windows.h>#include <limits.h>#include <math.h>void ...
- mysql知识
1.Limit 在语句的最后,起到限制条目的作用 Limit [offset,] [N] offset:偏移量 N:取出条目 例子:select * from stu limit 3,3; 2.左连接 ...
- Delphi DLL的创建、静态及动态调用
转载:http://blog.csdn.net/welcome000yy/article/details/7905463 结合这篇博客:http://www.cnblogs.com/xumenger/ ...
- netfilter的钩子——数据包在内核态得捕获、修改和转发
转发:http://blog.csdn.net/stonesharp/article/details/27091391 数据包在内核态得捕获.修改和转发(基于 netfilter) 忙活了好几天 ...
- 一把鼻涕一把泪 搭建公网ftp服务器
至于为什么要搭建公网ftp服务器,就当我心血来潮吧. ftp开源工具很多,咱用的是filezilla服务器.后来为了方便搭建web服务器,就改成了集成工具xampp.客户端工具也是filezilla ...
- [工作中的设计模式]享元模式模式FlyWeight
一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...
- Linux 安装tomcat
安装命令: yum install tomcat 安装完后默认: 安装路径: /usr/share/tomcat 执行命令(启动,停止, 重启): /etc/rc.d/init.d/tomcat 配置 ...