微信的红包算法 了解一下两种就可以了

1.微信红包算法

代码大致意思是这样的:假设有100元钱,分给十个人。那么第一个人获得红包大小怎么计算呢?100/10 = 10元。这是期望值。从0.01到20的区间中(其中20=10乘以2)随机抽取一个数,就是第一个人获得红包的大小。假设第一个人获得了15元,那么剩下的85元平均分给9个人,这九个人平均获得红包大小为9.4元,那么第二个人的红包大小均匀分布于0.01元到18.80元的区间中,依次类推。算法保证最后一个人至少抽到0.01元。

微信红包的代码c++

class LeftMoneyPackage
{
public:
	LeftMoneyPackage(int size, int money);  //初始化个数和金额
	~LeftMoneyPackage();
	double getRandomMoney();   //微信红包算法
	double getRandomMoney_1();  //上下限红包算法

private:
	double remainSize;  //剩余的个数
	double remainMoney;  //剩余金额
	//上下限法用一下参数
	double SMIN;     //下限
	double SMAX;  //上限
	const int N = 99;    //用于rand();
};

LeftMoneyPackage::LeftMoneyPackage(int size, int money)  //初始化
{
	remainSize = size;
	remainMoney = money;
	SMIN = (remainMoney / remainSize) * 0.1;
	SMAX = (remainMoney / remainSize) * 1.9;
}

LeftMoneyPackage::~LeftMoneyPackage()
{
}


double LeftMoneyPackage::getRandomMoney() {  //微信红包算法
	if (remainSize == 1) {  		//最后一个红包
		remainSize--;
		return (double)remainMoney;
	}
	double min = 0.01;   //最小值
	//cout << "remainMoney : " << remainMoney << endl;
	//cout << "remainSize : " << remainSize << endl;
	double max = remainMoney / remainSize * 2;  //最大值

	//cout << "max : " << max << endl;
	double money = ((rand() % N + 1) / (double)(N + 1))*max;  //随机得到一个值
	money = money <= min ? 0.01 : money;
	money = floor(money * 100) / 100;
	remainMoney -= money;
	remainSize--;
	return money;
}

2.需求分析与实现-带上下限对称随机红包算法

假设总金币数量为S1,总份数为P1,已发币量为S2,已发份数为P2,则:
平均值为S1/P1,则随机下限SMIN=(S1/P1)*0.1,随机上限SMAX=(S1/P1)*1.9。
设生成的第n个随机币值为X,剩余获取总值为Y,则剩余币S1-S2=X+Y,当Y取最大值时X取最小值,当Y取最小值时X取最大值,同时X应处于限定随机上下限(SMIN~SMAX)之间,得出:
X的随机范围为:MAX(S1–S2-(P1–P2-1)*SMAX,SMIN)<=X<=MIN(S1–S2–(P1–P2-1)*SMIN,SMAX)

double LeftMoneyPackage::getRandomMoney_1() {
	if (remainSize == 1) {
		remainSize--;
		return (double)remainMoney;
	}
	cout << "上限 :" << min(remainMoney - (remainSize - 1) * SMIN, SMAX) << endl;
	cout << "下限 :" << max(remainMoney - (remainSize - 1) * SMAX, SMIN)<< endl;
	double money = ((rand() % N + 1) / (double)(N + 1)) * (min(remainMoney-(remainSize-1)* SMIN,SMAX) - max(remainMoney - (remainSize - 1) * SMAX,SMIN)) + max(remainMoney - (remainSize - 1) * SMAX, SMIN);
	remainSize--;
	remainMoney -= money;
	return money;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本
微信红包算法涉及到微信支付和微信红包接口的调用,需要进行授权认证和支付操作,因此需要使用微信官方提供的SDK进行开发。 以下是一个基本的微信红包算法的示例代码: ```php <?php require_once "WxPayApi.php"; // 引入微信支付SDK // 微信支付配置参数 $config = new WxPayConfig(); $config->SetAppId("YOUR_APPID"); $config->SetMchId("YOUR_MCHID"); $config->SetKey("YOUR_KEY"); $config->SetNotifyUrl("YOUR_NOTIFY_URL"); // 获取红包信息 $redpack = $_POST["redpack"]; // 前端传递的红包信息 $redpack_info = json_decode($redpack, true); // 解析红包信息 // 构造红包支付请求参数 $input = new WxPayUnifiedOrder(); $input->SetBody("红包支付"); // 商品描述 $input->SetOut_trade_no($redpack_info["redpack_id"]); // 商户订单号 $input->SetTotal_fee($redpack_info["total_amount"] * 100); // 总金额,单位为分 $input->SetSpbill_create_ip($_SERVER["REMOTE_ADDR"]); // 终端IP $input->SetNotify_url($config->GetNotifyUrl()); // 通知地址 $input->SetTrade_type("JSAPI"); // 交易类型 $input->SetOpenid($redpack_info["openid"]); // 用户标识 // 调用统一下单API获取预支付交易会话标识 $wxpay_api = new WxPayApi($config); $result = $wxpay_api->unifiedOrder($input); if ($result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS") { // 构造红包接口请求参数 $redpack_input = new WxPayRedPack(); $redpack_input->SetMch_billno($redpack_info["redpack_id"]); // 商户订单号 $redpack_input->SetSend_name("微信红包"); // 商户名称 $redpack_input->SetRe_openid($redpack_info["openid"]); // 用户openid $redpack_input->SetTotal_amount($redpack_info["total_amount"] * 100); // 付款金额,单位为分 $redpack_input->SetTotal_num(1); // 红包发放总人数 $redpack_input->SetWishing("恭喜发财,大吉大利"); // 红包祝福语 $redpack_input->SetClient_ip($_SERVER["REMOTE_ADDR"]); // Ip地址 $redpack_input->SetAct_name("微信红包"); // 活动名称 $redpack_input->SetRemark("微信红包"); // 备注信息 // 调用红包接口发放红包 $result = $wxpay_api->sendRedPack($redpack_input); if ($result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS") { echo "红包发送成功!"; } else { echo "红包发送失败!"; } } else { echo "统一下单失败!"; } ``` 需要注意的是,该示例代码仅供参考,实际开发中需要根据具体业务场景进行适当的修改和调整。另外,微信红包接口需要在微信商户平台进行开通和配置,具体操作请参考微信官方文档和开发者文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值