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,一类是后端单元 ...
随机推荐
- 【转载】CentOS服务器配置VPN详解
转载来自: https://bbs.aliyun.com/read/162297.html http://www.wanghailin.cn/centos-7-vpn/ 操作系统:CentOS 6.3 ...
- .NET中RabbitMQ的使用
概述 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public ...
- UVA 10780 Again Prime No Time.(数学)
给定两个整数m和n,求最大的k使得m^k是n!的约数 对m质因子分解,然后使用勒让德定理求得n!包含的质数p的阶数,min(b[i] / a[i])即为结果k, 若为0无解 #include<c ...
- python处理地理数据-geopandas和pyshp
这边博客并不是有关geopandas的教程和pyshp的教程! 使用python来处理地理数据有很多相关的包,最近研究需要处理一些地理数据,然而arcgis的arcpy总是不能令人满意.所以这里说说p ...
- 常见开发需求之前端利器webstorm中的git和快捷键
需求 前端开发中我们最常用的一般是webstorm.hbuilder和sublime,因为以前使用过一段时间eclipse所以我对webstorm的感觉比较良好,再加上以前使用hbuilder维护 ...
- redis数据类型之—Sorted set
(1)sorted set 简单介绍 有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素. (2)sorted set 常用命令
- Install MySQL on CentOS 7
原文:https://devops.profitbricks.com/tutorials/install-mysql-on-centos-7/ 1.下载mysql 在mysql官网选择适合的mysql ...
- DIV的Position属性和DIV嵌套DIV
1.前言 我们在利用div+css进行布局时,常常被div的位置弄的焦头烂额,很多人甚至放弃了div而直接用table.这里一如既往的推荐使用div布局,其实我们只要掌握了div的position属性 ...
- 关于Xcode8.1 / iOS10+ 真机测试系统打印或者宏定义打印不显示问题
前言: 最近做项目时遇到了很多莫名其妙的问题,其中就有这个打印(NSLog).也不多废话了,我们先来回顾一下Xcode8发布以来,我们遇到的一些关于打印的问题,当然也有解决方法: 1.Xcode8打印 ...
- Trie URAL 7192 Chip Factory (15长春J)
题目传送门 题意:从n个数中选出不同的三个数a b c,使得(a+b)^c 最大 分析:先将所有数字按位插入到字典树上,然后删除两个数字,贪心询问与剩下的数字最大异或值. /************* ...