java 模拟QQ拼手气红包
Posted KdanMin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 模拟QQ拼手气红包相关的知识,希望对你有一定的参考价值。
package com.test;
import java.util.Random;
import java.util.Scanner;
public class RedPackage
/**
* 模拟QQ拼手气红包
* @author zm
* @param args
*/
public static void main(String[] args)
int num = 0;// 红包的个数
double cash = 0;// 总钱数
int pin = 0;// 判断是否拼手气的临时变量
int MaxNo = 0;// 记录最大值的位置
int MinNo = 0;// 记录最小值的位置
while (true)
System.out.println("1.请问要发多少个红包?");
Scanner number = new Scanner(System.in);
num = number.nextInt();// 读取用户输入,并存入num变量
if (num == 0)// 如果用户输入了0
System.out.println("输入错误,请输入大于0的整数!" + "\\n" + "请重新输入!" + "\\n");// 返回警告
// System.exit(0);//结束程序
else
break;
System.out.println();
double[] a = new double[num];// 定义一个double型的有num个元素的数组
while (true)
System.out.println("2.请问要发多少钱?");
Scanner coin = new Scanner(System.in);
cash = coin.nextDouble();// 读取用户输入,并存入cash变量
if ((100 * cash) % 1 != 0)// 如果用户输入了三位或更多位的小数
System.out
.println("输入错误,请输入最多保留两位的小数" + "\\n" + "请重新输入!" + "\\n");// 返回警告
// System.exit(0);//结束程序
else if ((cash / num) < 0.01)// 如果每个红包平均分到的金额小于0.01元
System.out.println("红包数不能少于0.1");
// 返回警告
// System.exit(0);//结束程序
else if ((cash / num) > 200)// 如果每个红包平均分到的金额大于200元
System.out.println("金额错误,单个红包金额不可大于200元,请调整金额和红包数");
// 返回警告
// System.exit(0);//结束程序
else
break;
System.out.println();
while (true)
System.out.println("是否设定为拼手气红包?(请输“1”或“2”,1代表是,2代表否)");
Scanner pi = new Scanner(System.in);
pin = Integer.parseInt(pi.nextLine());// 读取用户输入,并存入pin变量
if (pin == 0)
System.out.println("选择错误,请选择1或2!" + "\\n" + "请重新输入!" + "\\n");// 返回警
else if (pin > 2)
System.out.println("选择错误,请选择1或2!" + "\\n" + "请重新输入!" + "\\n");// 返回警
else
break;
if (pin == 1)
System.out.println("\\n正在生成总金额为" + cash + "元的" + num + "个拼手气红包");
pinshouqiArray(a, cash);
// printArray(a);
double sum2 = Math.round(sum(a) * 100);
// System.out.println(sum2/100);
int cash1 = (int) (cash * 100);
int sum1 = (int) (sum2);
int resi = cash1 - sum1;
for (int i = 0; i < resi; i++)
a[(int) (Math.floor(a.length * Math.random()))] += 0.01;
sishewuru(a);
printArray(a);
double sum3 = Math.round(sum(a) * 100);
System.out.println("共发出:" + sum3 / 100 + "元");
MaxNo = Max(a);
MinNo = Min(a, cash);
if (MaxNo == MinNo)
System.out.println("大家拿的都一样╮(╯▽╰)╭");
else
System.out.println("第" + MaxNo + "位童鞋手气最佳!");// 显示手气最佳的人
System.out.println("第" + MinNo + "位童鞋请再接再厉!");// 显示手气最差的人
else if (pin == 2)
System.out.println("\\n正在生成总金额为" + cash + "元的" + num + "个普通红包");
if (cash * 100 / num != 1)
System.out.println("金额不能平均分配给每个红包,程序结束");
System.exit(0);
else
a = putongArray(a, cash);// 普通红包,存入数组
printArray(a);// 打印每个红包到屏幕
double sum3 = Math.round(sum(a) * 100);
System.out.println("总金额:" + sum3 / 100);
public static double[] initial(double[] a)
for (int i = 0; i <= a.length - 1; i++)
a[i] = 0.01;
return a;
public static void printArray(double[] a)// 方法:打印数组到屏幕
System.out.print("结果:" + "\\n");
for (int i = 0; i <= a.length - 1; i++)
System.out.println("第" + (i + 1) + "个红包里面有" + a[i] + "元");
public static double[] baoliu(double[] a)// 保留两位小数,不要四舍五入
double b = 0;
double c = 0;
for (int i = 0; i < a.length; i++)
b = a[i];
c = (Math.floor(100 * b));// 向下取整
c /= 100;
a[i] = c;
return a;
public static double[] arraygenerate(double[] a)// 产生随机数组
for (int i = 0; i <= a.length - 1; i++)
a[i] = Math.random();
a = baoliu(a);
return a;
public static double[] pinshouqiArray(double[] a, double cash)
arraygenerate(a);// 随机给数组中的每个元素分配一个0~1之间的小数
double sum = 0;// 定义变量
sum = sum(a);
for (int i = 0; i <= a.length - 1; i++)
a[i] *= ((cash - a.length * 0.01) / sum);
a[i] += 0.01;
baoliu(a);
return a;// 返回数组
public static double[] sishewuru(double[] a)// 保留两位小数,四舍五入
double b = 0;
double c = 0;
for (int i = 0; i < a.length; i++)
b = a[i];
c = Math.round(100 * b);// 向下取整
c /= 100;
a[i] = c;
return a;
public static double sum(double[] a)
double sum = 0;
for (int i = 0; i <= a.length - 1; i++)
sum += a[i];// 算出所有元素的总和
return sum;
public static double[] putongArray(double[] a, double cash)// 普通红包
for (int i = 0; i <= a.length - 1; i++)
double temp = 0;
temp = Math.floor(cash * 10);// 向下取整,为避免系统自动四舍五入导致超额的情况
temp /= 10;
a[i] = temp / a.length;// 取平均值
return a;// 返回数组
public static int Max(double[] a)// 求最大值的序号
double max = 0;
int recmax = 0;
for (int i = 0; i <= a.length - 1; i++)
if (a[i] > max)
max = a[i];
recmax = i + 1;
return recmax;// 返回最大值的序号
public static int Min(double[] a, double cash)// 求最小值的序号
double min = cash + 1;
int recmin = 0;
for (int i = 0; i <= a.length - 1; i++)
if (a[i] < min)
min = a[i];
recmin = i + 1;
return recmin;// 返回最小值的序号
效果如下:
1.请问要发多少个红包?
6
2.请问要发多少钱?
10
是否设定为拼手气红包?(请输“1”或“2”,1代表是,2代表否)
1
正在生成总金额为10.0元的6个拼手气红包
结果:
第1个红包里面有0.34元
第2个红包里面有3.99元
第3个红包里面有1.3元
第4个红包里面有1.88元
第5个红包里面有0.4元
第6个红包里面有2.09元
共发出:10.0元
第2位童鞋手气最佳!
第1位童鞋请再接再厉!
以上是关于java 模拟QQ拼手气红包的主要内容,如果未能解决你的问题,请参考以下文章
拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编
拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编