首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

关于随机数权重的交流解决方案

2013-07-04 
关于随机数权重的交流本帖最后由 wang1cole 于 2013-04-11 17:00:16 编辑我想问下有一个数组,这些数组中的

关于随机数权重的交流
本帖最后由 wang1cole 于 2013-04-11 17:00:16 编辑 我想问下有一个数组,这些数组中的值都有自己的权重,怎样设计才能高效的优先取出权重高的数??数据量大概400条左右。
我的想法是先random这些数组的索引M条,然后将这些索引乘上自己的权重得到一个值,再在这些值中由大到小排列,取出前N条值对应索引中的数据。
想法貌似效率低下没什么含量。问下有没有了解这方面的给指点下,或者给些资料我拓展下思路??
谢谢了! random 算法 权重
[解决办法]
轮盘赌,俄罗斯轮盘

[解决办法]
把数组转换为一个区间,假设数组只有两个元素
比如假设 a[0] 权重为 0.5 , a[1] 权重为 2, 那从 [0,0.5) 属于a[0], [0.5,2.5) 属于a[1]
然后就在[0,2.5)区间随机, 随机数出来后, 二分找到它是对一哪个元素。
这个是通用算法, 如果你的权重精度要求不高的话, 说不定直接可以把400个数组转换为另一个长一点的数组, 比如上面例子, 我可以建另外一个数组, b[0]=0, b[1]=b[2]=b[3]=b[4]=1, 这样在b数组里随机N次, 直接读到a中的索引了。
[解决办法]
提供一个思路, 首先假设数组中的权重都是整数. (如果是浮点, 思路一样)

假设
数组为: a   b   c   d
权重为: 88  23 10 7

按照权重排序后为:
数组为: d   c    b    a
权重为: 7  10  23  88

权重和为128, 那么在1~128之间随机一个数字, 这个数字落在如下范围就选择对于的元素.
1~7: d
8~17: c
18~40: b
41~128: a

具体做法就是
预处理: 
1. 对数组按照权重排序. (堆排序或者快排, 效率: N*LogN)
2. 遍历数组, 建立Map, key为权重范围, 值为元素的index. 同时统计权重总和. (效率: N*LogN, 空间: O(N) )
每次使用:
3. 随机1到权重总和的数字, 在Map中搜索, 根据命中的元素的index选择随机到的元素即可. (效率: LogN, 400个元素的情况下, 平均比较2.6次)

如果是浮点的话, 需要转化为正数. 假设浮点数进度为6位, 那么所有权重乘以(10^6)取整即可. 如果存在溢出可能, 用long long存储权重值. 空间占用稍微大一些了. 
[解决办法]

引用:
提供一个思路, 首先假设数组中的权重都是整数. (如果是浮点, 思路一样)

假设
数组为: a   b   c   d
权重为: 88  23 10 7

按照权重排序后为:
数组为: d   c    b    a
权重为: 7  10  23  88

权重和为128, 那么在1~128之间随机一个数字, 这个数字落在如下范围就选择对于的元素.
1~7: d
8~17: c
18~40: b
41~128: a

具体做法就是
预处理: 
1. 对数组按照权重排序. (堆排序或者快排, 效率: N*LogN)
2. 遍历数组, 建立Map, key为权重范围, 值为元素的index. 同时统计权重总和. (效率: N*LogN, 空间: O(N) )
每次使用:
3. 随机1到权重总和的数字, 在Map中搜索, 根据命中的元素的index选择随机到的元素即可. (效率: LogN, 400个元素的情况下, 平均比较2.6次)

如果是浮点的话, 需要转化为正数. 假设浮点数进度为6位, 那么所有权重乘以(10^6)取整即可. 如果存在溢出可能, 用long long存储权重值. 空间占用稍微大一些了. 

你说的大体上就是俄罗斯轮盘赌的做法
但是其实轮盘赌根本不需要对权重数组排序
权重和数组 w[i]存储的是[0,i]元素的所有元素的权重和  时间复杂度O(n) 空间复杂度O(n)
随机[0,W[399]] 看随机数 落在哪个Wi 内就选哪个  时间复杂度 O(longn) 
所以总的时间复杂度时间复杂度O(n) 空间复杂度O(n)
即使权重和很大也很简单,统一除以一个数就行了
线性映射而已,

------解决方案--------------------


其实算法上用到的轮盘赌的通用做法是
权重和数组除以W[399] 就是 概率和数组
p[i] ,随机产生[0,1]之间的随机数,落在哪个p[i]
内,就选择第i个 p[i]的意义就是概率和

热点排行