加权重随机算法

场景:有N个合作方,每一个合作方都有一定的权重,按权重随机选择一个合作方

typedef struct

{

string k;//partner_id

string v;//value

string m;//0:number 1:ratio

}Bookpartner_count_listInfo;

string GetRandNumRatio( vector<Bookpartner_count_listInfo> arpartner_count_list)

{

int weight = 0;

int user = 0;

Bookpartner_count_listInfo bp_cunt_list_temp[128];

for( vector<Bookpartner_count_listInfo>::iterator it = arpartner_count_list.begin(); it < arpartner_count_list.end(); it++)

{

weight += atoi(it->v.c_str());

for( int i = 0; i < atoi( it->v.c_str()); i++ )

{

*(bp_cunt_list_temp + weight - i) = *it;

}

}

struct timeval tv;

gettimeofday(&tv, NULL);

srand(tv.tv_usec);

user = rand() % weight;

Bookpartner_count_listInfo bk_pcl_temp = bp_cunt_list_temp[user];

return bk_pcl_temp.k;

}

时间: 2024-10-27 02:17:40

加权重随机算法的相关文章

权重随机算法的java实现

一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果中A:B:C:D的比例要为1:2:3:4. 总体思路:累加每个元素的权重A(1)-B(3)-C(6)-D(10),则4个元素的的权重管辖区间分别为[0,1).[1,3).[3,6).[6,10).然后随机出一个[0,10)之间的随机数.落在哪个区间,则该区间之后的元素即为按权重命中的元素. 实现方法

权重随机算法

int weightSum = 0; for (Item item : mItems) { weightSum += item.getWeight(); } if (weightSum <= 0) { return null; } Random random = new Random(); int randomNum = random.nextInt(weightSum); Integer m = 0; for (Item item : mItems) { if (m <= randomNum

根据权重随机选取指定条数记录的简单算法实现(C#)

一.应用场景: 有时我们需要从一些列数据中根据权重随机选取指定条数记录出来,这里需要权重.随机,我们根据权重越大的,出现概率越大.例如广告系统:可根据客户支付金额大小来调控客户们的广告出现概率,客户支付金额越大,其广告出现频率越频繁,例如:加入有10条广告,然后每条广告都有一个权重,我们每次要根据权重选取5条广告出来进行显示.有了需求,我们就进行解决,本文章就是利用一种简单的算法来实现根据权重来随机选取. 二.简单算法的实现: 根据我们需求,上网找了不少资料,都没有找到一种比较适合的方案,就自己

加权随机算法

加权随机算法一般应用在以下场景:有一个集合S,里面比如有A,B,C,D这四项.这时我们想随机从中抽取一项,但是抽取的概率不同,比如我们希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10%.一般来说,我们可以给各项附一个权重,抽取的概率正比于这个权重.那么上述集合就成了: {A:5,B:2,C:2,D:1} 方法一: 扩展这个集合,使每一项出现的次数与其权重正相关.在上述例子这个集合扩展成:{A,A,A,A,A,B,B,C,C,D}然后就可以用均匀随机算法来从中选取. 好处:选取的

由抽奖软件想到的随机算法总结

整整三年没更新博客了,今天和女友聊天,聊到了博客,就回来看看. 最近接触到抽奖软件,下载的源码是http://download.csdn.net/detail/ghz_sd/6918125,在这里为开源软件作出贡献的人致敬,这个软件的作者a米山,是个非常好的人,耐心的帮我调试,他的算法很简单,就是纯粹的random,用的rand()函数,我给他提了个需求,写一个作弊类,实现的功能是:指定人的中奖概率提高,配置文件类似于这样: <xml> <win> <name='a' pro

python的random模块及加权随机算法的python实现

random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Python会自动选择seed. random.random()    用于生成一个随机浮点数n,0 <= n < 1 random.uniform(a,b)    用于生成一个指定范围内的随机浮点数,生成的随机整数a<=n<=b; random.randint(a,b)    用于生成一个指定范围内的整数,a为下限,

带权随机数问题--根据权重随机选择一条路径

最近工作中遇到了一个根据权重随机选择一条路径的问题,一时没有啥好方案,参考借鉴了网上的经验,得出了如下解决方案: 思路:1.求权重的和,对(0,权重之歌和]区间进行划分,每个权重占用长度为权重的区间: 2.产生一个在(0,权重之和]区间的等概率随机数: 3.该随机数落在哪个区间,则该区间对应的权重的映射为本次产生的带权随机数. 1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.List; 4

飘逸的python - 带权随机算法及在抽奖中的应用

带权随机在游戏开发中重度使用,各种抽奖和爆装备等. 运营根据需要来配置各个物品出现的概率. 今天要说的这个带权随机算法思想很简单,就是"把所有物品根据其权重构成一个个区间,权重大的区间大.可以想象成一个饼图.  然后,扔骰子,看落在哪个区间," 举个栗子,有个年终抽奖,物品是iphone/ipad/itouch. 主办方配置的权重是[('iphone', 10), ('ipad', 40), ('itouch', 50)]. 用一行代码即可说明其思想,即random.choice(['

权重随机的实现

欢迎关注Github:https://github.com/teaey/ 权重随机在项目中经常用到,所以我把它抽象到一个工具类中. 一般实现随机权重有两种方式: 1. 使用一个数组存放权重对应的实际目标,比如A的权重是2,B的权重是3,那么数组长度为5, 数组前两个存放A,后三个存放B. 然后随机一个[0-数据长度)的数字,直接取数组对应下标的值就可以了. 优点:数据结构简单,算法高效,实现简单 缺点:当权重值比较大同时数据又比较多的时候,会浪费内存 2. 使用区间算法,从前到后依次叠加权重,然