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拼手气红包的主要内容,如果未能解决你的问题,请参考以下文章

拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编

拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编

小案例--python编写设置拼手气红包模块

java 红包规则

java 实现仿照微信抢红包算法,实测结果基本和微信吻合,附demo

看完微信抢红包算法你就明白,为啥你不是手气最佳