求按指定比例随机返回结果的算法

bearforcat 2012-03-28 10:09:25
给定一个整数数组(N1,N2,N3,...,Ni),要求随机打印该数组的元素,使N1出现的比率为N1/(N1+N2+N3+...+Ni),N2出现的比率为N2/(N1+N2+N3+...+Ni),以此类推。性能要求比较高。

谢谢啦!
...全文
249 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bearforcat 2012-03-30
  • 打赏
  • 举报
回复
谢谢各位的认真回复。

提这个问题实际上是为了做负载均衡,经过搜索发现该算法叫加权轮叫算法(Weighted Round Robin)。

最终我采用的是类似上面cattycat所说的方案,但做了两个优化:

1. 使用固定长度(100)的数组,避免当N过大时消耗过多内存。
2. 不使用随机数去访问数组(array[randNum]),而是预先将数组打乱顺序,然后顺序循环读取,使性能更高。

该方案存在一个限制:负载均衡主机数量不能超过数组长度,否则将有部分主机永远得不到负载。
erqieshi 2012-03-29
  • 打赏
  • 举报
回复
说错了
1楼的正解
说成"2楼可行"了,
楼主意思应该是打印多个数据,概率满足就打印 不是只打印一个
erqieshi 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

楼主看这样的思路对不对,假设数组都为正数,总和为sum,产生一个值在0-sum之间的随机数,如果数组中第n个数比这个随机数大就打印这个数,否则不打印
大概代码如下:
C/C++ code
void randPrint(int k[], int size){
int sum = 0;
int index = 0;
for(; index<size; ++index) ……
[/Quote]
++
2楼可行
cattycat 2012-03-29
  • 打赏
  • 举报
回复
楼上的if(k[index] > randNum) 这里满足条件的极少吧。
应该创建一个数组array,1到N1放N1, N1+N2放N2, 依次类推. 然后返回一个array[randNum]就可以了。这种办法相当于构造了一个均匀分布。
昵称很不好取 2012-03-28
  • 打赏
  • 举报
回复
楼主看这样的思路对不对,假设数组都为正数,总和为sum,产生一个值在0-sum之间的随机数,如果数组中第n个数比这个随机数大就打印这个数,否则不打印
大概代码如下:
void randPrint(int k[], int size){
int sum = 0;
int index = 0;
for(; index<size; ++index) sum += k[index];
srand(time(0));
int randNum = rand()%sum;
for(index=0; index<size; ++index){
if(k[index] > randNum)
printf("%d ",k[index]);
}
}

int main()
{
int k[] = {1,2,3,4,5};
randPrint(k,5);

return 0;
}

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧