求个发红包的算法,大神进来帮帮忙

乱世丶桃花 2016-01-06 01:21:26
假设总共有10000个金豆,现要分成100份用来包红包,每份红包最少要有60个金豆,最多可以有130个金豆,求个算法,谢谢
...全文
239 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
oggmm 2016-03-15
  • 打赏
  • 举报
回复
红包算法,可以参考以下链接: http://xxling.com/blog/article/2097.aspx
豫让_______ 2016-01-11
  • 打赏
  • 举报
回复
引用 3 楼 gezhengyun 的回复:
[quote=引用 2 楼 rickylin86 的回复:]


感谢这位仁兄,我需要的全是int型的数据,我在你的算法里把double改为int后发现有点问题,我再改改试试[/quote] 首先2楼兄台这个算法最后得到的list总数加起来只有9930,其次最后十几个值总是130.不论从130的数量还是130所在的位置是不符合抽奖的公平原则的。
乱世丶桃花 2016-01-08
  • 打赏
  • 举报
回复
引用 2 楼 rickylin86 的回复:


感谢这位仁兄,我需要的全是int型的数据,我在你的算法里把double改为int后发现有点问题,我再改改试试
rickylin86 2016-01-06
  • 打赏
  • 举报
回复

import java.util.Random;
import java.util.ArrayList;

public class Test{
	public static void main(String[] args){
		ArrayList<Double> list = process(10000,100,130,60);
		for(int i  = 0 ; i < list.size() ; i ++){
			System.out.printf("%-3d:%-6.3f%n",i+1,list.get(i));
		}
	}

	private static ArrayList<Double> process(double total,int count,double max,double min){
		ArrayList<Double> list = new ArrayList<>();

		assert total >= count * min;
		assert max > min;


		double totalRest = total - count * min;

		double current = 0.0;

		Random random = new Random();


		while(count > 0){
			current = random.nextDouble() * (max - min);
			if((totalRest - current) / count > max - min){
				continue;
			}
			if(totalRest >= current){
				totalRest -= current;
				count --;
				list.add(current + min);
			}else if(totalRest == 0){
				count --;
				list.add(min);
			}else{
				count --;
				list.add(totalRest + min);
				totalRest = 0;
			}
			
		}

		return list;
	}
}
豫让_______ 2016-01-06
  • 打赏
  • 举报
回复
一种比较合理的算法,把100个红包豆按阶梯均分,比如60 61 62 63.。。。130的数量均分,然后从中随机抽取。

50,542

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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