微信随机生成红包金额算法java版

最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发。

public class WxAlgorithm{

 /**
 * @param moneySum 输入总金额
 * @param redNum 输入红包数量
 */
 private static void wxAlgorithm(double moneySum, int redNum) {
 // 设置最小的金额
 double moneyMin = 0.01;
 Random random = new Random();
 //精确小数点2位
 NumberFormat formatter = new DecimalFormat("#.##");
 for (int i=1;i<redNum;i++)
 {
  //随机一个数,数值范围在最小值与余额之间
  String money = formatter.format(random.nextDouble() * (moneySum - moneyMin) + moneyMin);
  //数值转换
    moneySum = Double.valueOf(formatter.format(moneySum - Double.valueOf(money)));

  System.out.println("第"+i+"个红包:" + money + "元 ,余额:" + moneySum);
 }

 System.out.println("最后个红包:" + moneySum + "元 ,余额:" + (moneySum - moneySum));
 }

 public static void main(String[] args) {
 wxAlgorithm(10.26, 9);
 }
}

后来又在网上搜集了一些微信随机生成红包算法,供大家参考。

public static double [] getMoney(double money, int num){
  Random r = new Random();
  DecimalFormat format = new DecimalFormat(".##");

  double middle = Double.parseDouble(format.format(money/num));
  double [] dou = new double[num];
  double redMoney = 0;
  double nextMoney = money;
  double sum = 0;
  int index = 0;
  for(int i=num;i>0;i--){
   if(i == 1){
    dou[index] = nextMoney;
   }else{
    while(true){
     String str = format.format(r.nextDouble()*nextMoney);
     redMoney = Double.parseDouble(str);
     if(redMoney>0 && redMoney < middle){
      break;
     }
    }
    nextMoney = Double.parseDouble(format.format(nextMoney - redMoney));
    sum = sum + redMoney;
    dou[index] = redMoney;
    middle = Double.parseDouble(format.format(nextMoney/(i-1)));
    index++;
   }
  }
  return dou;
 }

这里一个基本思路是这样的:首先算出红包的平均值,再通过一个随机红包数小于这个平均值的红包,当该红包发完后,红包总金额需要相应减少,同时重新计算这个平均值:新的总金额%(原总红包数-1),直到最后一个红包时,把所有的剩余金额塞进去。

还有许多精彩源码分享:java简单的抢红包的随机分配红包算法实现源码。

package com.sunron.test;

import java.math.BigDecimal;

import org.junit.Test;

public class HongBao {
 @Test
 public void testHonbao(){
 hb(100, 9, 0.01);//金额,个数,最少值
 //zb();
 }
 void hb(double total,int num,double min){
 for(int i=1;i<num;i++){
 double safe_total=(total-(num-i)*min)/(num-i);
 double money=Math.random()*(safe_total-min)+min;
 BigDecimal money_bd=new BigDecimal(money);
 money=money_bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
 total=total-money;
 BigDecimal total_bd=new BigDecimal(total);
 total=total_bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
 System.out.println("第"+i+"个红包:"+money+",余额为:"+total+"元");
 }
 System.out.println("第"+num+"个红包:"+total+",余额为:0元");
 }

 void zb(){
   for(int a=0;a<=10000;a++){
   if(a % 1000== 0)
   System.out.println (a);
   }

 }

}

别人在抢红包,我们就来研究研究随机发红包的算法:

public static void main(String[] args) {
  //红包数
  int number = 10;
  //红包总额
  float total = 100;
  float money;
  //最小红包
  double min = 1;
  double max;
  int i = 1;
  List math = new ArrayList();
  DecimalFormat df = new DecimalFormat("###.##");
  while (i < number) {
   //保证即使一个红包是最大的了,后面剩下的红包,每个红包也不会小于最小值
   max = total - min * (number - i);
   int k = (int)(number - i) / 2;
   //保证最后两个人拿的红包不超出剩余红包
   if (number - i <= 2) {
    k = number - i;
   }
   //最大的红包限定的平均线上下
   max = max / k;
   //保证每个红包大于最小值,又不会大于最大值
   money = (int) (min * 100 + Math.random() * (max * 100 - min * 100 + 1));
   money = (float)money / 100;
   //保留两位小数
   money = Float.parseFloat(df.format(money));
   total=(int)(total*100 - money*100);
   total = total/100;
   math.add(money);
   System.out.println("第" + i + "个人拿到" + money + "剩下" + total);
   i++;
   //最后一个人拿走剩下的红包
   if (i == number) {
    math.add(total);
    System.out.println("第" + i + "个人拿到" + total + "剩下0");
   }
  }
//取数组中最大的一个值的索引
  System.out.println("本轮发红包中第" + (math.indexOf(Collections.max(math)) + 1) + "个人手气最佳");
 }

更多精彩内容请点击《Android微信开发教程汇总》,《java微信开发教程汇总》欢迎大家学习阅读。

以上就是为大家分享的多种微信随机生成红包算法,为大家提供了多种思路,希望对大家学习使用微信随机生成红包算法有所帮助,也希望大家继续关注我们的更多精彩内容。

(0)

相关推荐

  • java模拟微信抢红包的实例代码

    java简单模拟微信抢红包功能,本例发100元红包,有10个人抢,为了尽可能的公平,每个人的红包金额都要随机(保证结果的不确定性,本例抢红包的次序与红包金额匹配也随机),就是不能出现部分红包偏大部分偏小的情况,在区间0~100上随机生成9个节点,加0和100共11个节点按从小到大排序,各节点之间的差值就是红包金额,保证了红包金额之和等于100. public static void main(String[] args) { // 发100元红包,10人抢 // TODO Auto-genera

  • 微信开发之使用java获取签名signature

    一.前言 微信接口调用验证最终需要用到的三个参数noncestr.timestamp.signature: 接下来将会给出获取这三个参数的详细代码 本文的环境eclipse + maven 本文使用到的技术HttpClient.Json字符串转map.sha1加密 二.需要用到的jar包 maven依赖的包有: 1.HttpClient包依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <ar

  • JAVA实现简单抢红包算法(模拟真实抢红包)

    闲来无事,最近项目需求要写出用户登录首页来发现金红包,没有限额.我就自己稍微计算了一下如果有限额该怎么写.觉得这样与微信红包差不多.等项目需求完成以后.正好来博客贴一下我自己写的拆红包算法.个人觉得这个算法比较模拟现实抢红包规则.废话少说.先贴代码; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.ut

  • Java微信支付-微信红包

    微信红包的使用已经很广泛,本篇文章介绍了微信发红包的实例,需要有认证的公众号,且开通了微信支付,商户平台且开通了现金红包的权限即可. https://pay.weixin.qq.com商户登陆地址.选择查看营销中心的现金红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1 现金红包的官网文档说明 先看几个图 简单的测试.前提需要你去商户平台先充值.不支持预支付.本文只是总结微信现金红包接口的调用与

  • java微信红包实现算法

    随着目前微信越来越火,所以研究微信的人也就越来越多,这不前一段时间,我们公司就让我做一个微信公众号中问卷调查发红包功能,经过一段时间的研究,把功能完成,里面主要的实现步骤都是按照微信公众号开发文档来的,很详细,在整个过程唯有红包算法需要仔细编写,因为毕竟涉及到钱,所以得小心,而且不仅微信中需要发红包,我们在做APP时可能也会遇到需要发红包的功能,所以这里列出红包的核心算法,供大家一起学习研究. public static List getRed(int number,float total,do

  • Java抢红包的红包生成算法

    马上过年了.过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分解成n个小整数的过程,小整数的范围是[min, max]. 最简单的思路,先保底,每个小红包保证有min,然后每个请求都随机生成一个0到(max-min)范围的整数,再加上min就是红包的钱数. 这个算法虽然简单,但是有一个弊端:最后生成的红包可能都是min钱数的.也就是说可能

  • java 微信随机红包算法代码实例

    前几天的一个晚上突然想到微信红包应该有一个随机算法,就自己试着写了下,也不知道对不对,看了看网上的说法,好像到现在为止官方也没有给出一个确切的算法,只好在这里献丑了,先贴出代码: public static double [] getMoney(double money, int num){ Random r = new Random(); DecimalFormat format = new DecimalFormat(".##"); double middle = Double.p

  • java微信公众号开发案例

    微信公众号开发一般是针对企业和组织的,个人一般只能申请订阅号,并且调用的接口有限,下面我们就来简单的描述下接入公众号的步骤: 1.首先你需要一个邮箱在微信公众号平台进行注册:      注册的方式有订阅号.公众号.小程序和企业号,个人我们这里只能选择订阅号 2.注册完后,我们登录到公众号平台--->开发--->基本配置,这里需要填写URL和token,URL就是我们使用服务器的接口: 3.Java Web服务器程序编译好且在服务器上部署可以运行的话,可在微信公众号进行在线接口调试: 1).选择

  • Java实现仿微信红包分配规则

    最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教. 算法介绍 一.红包金额限制 对于微信红包,我们知道没人随机的最小红包是1分,最大金额是200元,这里我们同样来设置红包的范围,下面代码我们统一金钱的单位为分. //最小红包额度 private static final int MINMONEY = 1; //最大红包额度 private static final int MAXMONEY = 200

  • java调用微信现金红包接口的心得与体会总结

    这几天看了下之前写的有关微信支付的博客,看的人还是挺多的,看了下留言不知道是因为博客写的不够细还是什么情况,大多都找我要源码,我觉得吧程序员还是需要有这么一个思考的过程,因此没直接给源码,俗话说"授人以鱼不如授人以渔".因此希望看文章的同时也花一点时间自己亲自敲一敲代码.好了废话不多说这次来分享微信现金红包接口的使用. 下面是微信开发文档对现金红包的介绍: 现金红包,是微信支付商户平台提供的营销工具之一,上线以来深受广大商户与用户的喜爱.商户可以通过本平台向微信支付用户发放现金红包.用

随机推荐