假设红包总额M元,分给N个人。

满足条件:

如果是普通红包,每个人获得的金额都一样;

如果是拼手气红包,则有所区别,但不能金额过于离谱,比如第一个获得的太多,以至于后来的人都几乎没得分。

注意点:

1.总额必须准确

2.最小金额为0.01元,即1分;

3.获得红包金额的概率须加以控制。

一、普通红包

核心代码:

public ArrayList divide(int totalMoney, int count) {

// 创建保存各个红包金额的集合

ArrayList list = new ArrayList<>();

// 计算平均金额

int avgMoney = totalMoney / count;

// 设置前面count‐1个人都是平均的金额

for (int i = 0; i < count ‐ 1; i++) {

list.add(avgMoney);

// 从总金额中减去已分配的金额,就是最后一个人剩余的金额

totalMoney ‐= avgMoney;

}

// 将剩余的金额设置给最后一个人

list.add(totalMoney);

return list;

}

二、拼手气红包

本质上,手气红包就是把总金额 totalMoney 随机分成指定的 count 份,所以必须规定每一份金额的取值范围。如果范围太小,可能导致后分配红包金额特别大。反之范围太大,可能导致后分配红包金额为0,不够分。可见,取值范围的定义规则,是手气红包的关键所在。

我们规定:每一份随机金额范围(除最后一份),最小值为1,最大值为当前剩余平均金额的2倍 ,单位为"分"。

计算公式:

当前剩余平均金额=剩余总金额/剩余红包个数——程序中,建议换算为"分"进行运算。

核心代码:

public ArrayList divide(int totalMoney, int count) {

// 创建保存各个红包金额的集合

ArrayList list = new ArrayList<>();

// 定义循环次数,总个数‐1次

int time = count ‐ 1;//注意此处为何减一

// 创建随机数对象

Random random = new Random();

//总金额转换成分

moneyfen=totalMoney*100;

// 循环分配

for (int i = 0; i < time; i++) {

/*

* 每次重新计算,生成随机金额

* 随机范围: totalMoney / count * 2,totalMoney不断的减少,

* count也不断的减少,所以这是一个可变化的范围.

*/

int moneyget = random.nextInt(moneyfen / count * 2) + 1;

// 金额添加到集合

list.add(money/100);//加减乘除计算,会先统一操作数的精度,其规则是先统一成精度高的数。

//如上,double型/int型、int型/double型,最后都转成double型/double型。

// 总金额扣除已分配金额

monfen ‐= moneyget;

// 红包个数‐1

count‐‐;

}

// 剩余的金额,为最后一个红包

list.add(moneyfen/100);

return list;

}

备注:

代码中用到java.util.Random类。下面Random()的两种构造方法:

Random():创建一个新的随机数生成器。

Random(long seed):使用单个 long 种子创建一个新的随机数生成器。

如下面的Java代码:

Random rand =new Random(25);

int i;

i=rand.nextInt(100);

初始化时25并没有起直接作用(注意:不是没有起作用),rand.nextInt(100);中的100是随机数的上限,产生的随机数为0-100的整数,不包括100。

下面是Java.util.Random()方法摘要:

protected int next(int bits):生成下一个伪随机数。

boolean nextBoolean():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。

void nextBytes(byte[] bytes):生成随机字节并将其置于用户提供的 byte 数组中。

double nextDouble():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值。

float nextFloat():返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。

double nextGaussian():返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。

int nextInt():返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。

int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。

long nextLong():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。

void setSeed(long seed):使用单个 long 种子设置此随机数生成器的种子。

下面给几个例子:

生成[0,1.0)区间的小数:double d1 = r.nextDouble();

生成[0,5.0)区间的小数:double d2 = r.nextDouble() * 5;

生成[1,2.5)区间的小数:double d3 = r.nextDouble() * 1.5 + 1;

生成-231到231-1之间的整数:int n = r.nextInt();

生成[0,10)区间的整数:

int n2 = r.nextInt(10);//方法一

n2 = Math.abs(r.nextInt() % 10);//方法二

参考资料:

http://blog.sina.com.cn/s/blog_93dc666c0101h3gd.html

https://www.jb51.net/article/176121.htm

http://blog.csdn.net/wpjava/article/details/6004492

https://www.cnblogs.com/ningvsban/p/3590722.html

标签:count,红包,Java,int,微信,生成器,随机数,double

来源: https://blog.csdn.net/qq_30242987/article/details/104816994

h5拼手气红包java_Java模拟微信发红包(普通红包、拼手气红包)相关推荐

  1. java微信红包_Java模拟微信发红包(普通红包、拼手气红包)

    假设红包总额M元,分给N个人. 满足条件: 如果是普通红包,每个人获得的金额都一样: 如果是拼手气红包,则有所区别,但不能金额过于离谱,比如第一个获得的太多,以至于后来的人都几乎没得分. 注意点: 1 ...

  2. 用Java写微信红包实现模拟微信发红包

    继承关系如下 题目: 某软件有多名用户(User类),某群聊中有群主(Manager类)和多名普通成员(Member类),现群主大方给成员发红包.红包的规则:群主发一笔金额,从群主余额中扣除,红包分配 ...

  3. python模拟微信发红包,并验证随机性

    python模拟微信发红包,输入金额和红包个数,得到结果,多次发红包,验证先抢后抢红包大小的随机性是否一样. 1.思路 如100元发5个红包,结合几个点几个线段的数学知识,需要在0-100之间取4个不 ...

  4. 编写一个函数,简单模拟微信发红包算法。

    编写一个函数,简单模拟微信发红包算法. 函数有两个参数:一个参数表示红包总金额,默认值为100:另一个参数表示红包数量,默认值为15. 所有随机产生的红包金额(保留两位小数)存放在一个列表(同时作为函 ...

  5. Random类模拟微信发红包

    //用随机数模拟微信发红包的场景 import java.util.Random; import java.util.Scanner; public class Demo4 { public stat ...

  6. 编写一个函数,模拟微信发红包的红包分配过程。函数有两个参数:一个参数表示红包总金额,默认值为100,另一个参数表示红包数量,默认为10。程序输入:红包总金额和红包数量;程序输出:每个红包的金额。要求:

    题目 ‬‬编写一个函数,模拟微信发红包的红包分配过程.函数有两个参数:一个参数表示红包总金额,默认值为100,另一个参数表示红包数量,默认为10.程序输入:红包总金额和红包数量:程序输出:每个红包的金 ...

  7. python模拟微信发红包算法_微信红包的随机算法是怎样实现的?

    有人问过微信的人,大致是这样: 先上代码: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余 ...

  8. Java模拟微信发红包

    作者说: 这个实验运用到了Random类的生成随机数的知识.String类的format方法保留两位小数.灵活运用类型转换. 这次注释写的很详细,因为我做这个实验的时候花了很长时间,我第一次用的方法不 ...

  9. 模拟微信发红包的算法工具类

    刚开始这个算法本身是bug 的,就是生成的尾数老是存在0,1,9 特别多,感觉上不是很好,就跟着思路修改啦一下,现在分享出来希望对大家有用,但是还是不是很完美,就是出现整数的概率很小 ,大家可以多试试 ...

最新文章

  1. Halcon 点云拟合平面并获取单位法向量及位姿
  2. android 自编译 img,android源码编译生成ramdisk.img和system.img解压和使用(基于海天雄A9+android2.3.3)...
  3. macbookpro升级后打不开eclipse_维修分享——面容坏升级iOS13系统后 导致前后摄像头都打不开...
  4. python之Map函数
  5. linux 未找到wifi适配器,无线 - 重新启动后找不到WI-FI适配器
  6. IE下的一个安全BUG —— 可实时跟踪系统鼠标位置
  7. git 应用 cherry-pick
  8. java duration 时间差_java8 计算时间差的方法示例
  9. 发布不同类型的话题问题
  10. 【服务器】【私有云】宝塔安装KodExplorer
  11. 搭建Eclipse 2020安卓开发环境
  12. 妙趣横生的算法(C语言实现 第2版)pdf
  13. javascript 下载方法
  14. 数据库技术与应用知识点小结(上)
  15. wps office 2010 Wps文字文档保存及自动保存方法介绍
  16. Python(x,y)
  17. 六大云端 Jupyter Notebook 平台测评
  18. Java+Swing+mysql5实现超市商品管理系统
  19. python中ceil函数是什么意思_python中ceil()函数用法
  20. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第十九集

热门文章

  1. Android4.1.1,USB存储模式
  2. 八大排序算法 —— 归并排序
  3. ieda ts文件报错_Intellij IDEA就这样配置,快到飞起!
  4. oracle怎么判断一个日期是一年的第几天
  5. 电路中串联 并联 电阻作用
  6. 掘金开发者大会 ∙ 微信小程序专场正式启动|文末有福利
  7. JS控制网页滑动顶部导航条变色
  8. rocketmq,索尔,qf,视频
  9. java函数式编程之Supplier
  10. 【STM32Cube笔记】15-数模转换AD/DA