發手氣紅包演算法

2022-05-23 07:57:09 字數 1163 閱讀 2704

lowest=0.01元,最小金額

操作是整數,最小人民幣單位是分,所以有2位小數,最少是0.01元

發金額totalbill

發n人,就取1到100的隨機數n個

為了提高精度,把金額放大100倍  totalamount=totalbill*100

n個人各取的隨機數累加得到總份量,用總發紅金額totalamount去除總份量,得到

每乙份的金額 peramount=totalamount/n    peramount 採用四捨五入,保留2位小數

開始發紅包 若n個人,有人的隨機數不幸取到0,不能給0元,否則會罵人的,給最小數lowest 0.01元

其它是 perbill=pernum*peramout/100

發到倒數第二個人,最後乙個人不能按照公式發,要總數totalbill-已發金額,(原因是上面每份金額

peramount 保留兩位小數時,採用四捨五入,丟失了精度)

舉例說明:

6元發給3個人

金額放大100倍提高精表 6*100=600

從0到100取3個隨數,如 20 50 60

每份金額 600/(20+50+60)=4.615384615384615  這時為了計算更快,保留兩位小數 4.62

損失了精度,最後乙個人發紅包時演算法要注意

第乙個人得到 (4.62*20)=92.4 取整數 92,縮小100回歸正常倍數 92/100=0.92元

第二個人得到 (4.62*50)=231 取整數 231,縮小100回歸正常倍數 231/100=2.31元

第三個人得到 6 -(0.92+2.31)=2.77元

附上python**:

# -*- coding: utf-8 -*-

# 思路:先隨機出來m個數,然後平均分成m個數字只和的份數,然後將錢平均分給m個人#

import random

def checkparam(total,num):

if(type(num) != type(1)):

print "num must be integer";

return false;

if(num < 0):

print "num must be positive integer";

return false;

return true;

C 實現拼手氣紅包演算法

一 方案1 即開即中,考慮機會均等,減少金額差較大的機率 可以每次點選時候,隨機產生 static double getrandommoney double money,int n for int i 0 i n i return array 程式設計客棧 即開即中,考慮機會均等,減少金額差較大的機...

PHP隨機紅包演算法

2017年1月14日 14 19 14 星期六 一,整體設計 演算法有很多種,可以自行選擇,主要的 架構 是這樣的,用redis decr 命令去限流,用mysql去記錄各種需要的資料 二,紅包演算法 簡便起見,紅包金額用整數表示,假設每個紅包裡邊有x個糖豆,每個人最少乙個豆 一種 每個紅包的最大金...

如何實現搶紅包演算法?

方法一 二倍均值法 public static listdivideredpackage integer totalamount,integer totalpeoplenum amountlist.add restamount return amountlist 缺陷 除了最後一次,任何一次搶到的金...