实现抢红包算法

发出一个固定金额的红包,由若干人来抢,需要满足哪些规则?

1.所有人抢到金额之和等于红包金额,不能超过,也不能少于。
2.每个人至少抢到一分钱。
3.要保证所有人抢到金额的几率相等。

一般想到的是每次抢红包的时候直接随机就好,随机的上限是剩余的红包余额。
每次抢到的金额 = 随机区间(0,剩余金额)
但是这样是有问题的。先抢的人会有很大的优势,越往后的人随机的金额越小
例:
假设有10个人,红包总额100元。
第一个人的随机范围(0,100元),平均可以抢到50元。
假设第一人随机到50元,剩余金额是100-50 = 50元。
第二个人的随机范围是(0,50元),平均可以抢到25元。
以此类推,每一次随机范围越来越小。

二倍均值法

剩余红包金额为M,剩余人数为N,那么有如下公式:
每次抢到的金额 = 随机区间(0,M/N X 2)
这个公式 ,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。
例:
假设有10个人,红包总额100元。
(100 / 20 )x 2 = 20 所以第一个人的随机范围是(0,20 ),平均可以抢到10元。
假设第一个人随机到10元,那么剩余金额是100-10 = 90 元。
90/9X2 = 20, 所以第二个人的随机范围同样是(0,20 ),平均可以抢到10元。
假设第二个人随机到10元,那么剩余金额是90-10 = 80 元。
80/8X2 = 20, 所以第三个人的随机范围同样是(0,20 ),平均可以抢到10元。
以此类推,每一次随机范围的均值是相等的。

import java.util.*;

public class WeiXinRedPackage1 {


public static void main(String[] args) {
    double sum = 0;
    ArrayList<Double> res 
           = WXRedPackageAlgorithm(10,3);

    for(double money:res) {
        sum += money;
        System.out.print(money +" ");
    }

    System.out.println();
    System.out.println(sum);     
}

private static ArrayList<Double> WXRedPackageAlgorithm(double restMoney,int restNum){                
    ArrayList<Double> res 
             = new ArrayList<>(restNum);

    Random random=new Random();
    while(restNum>1) {
        //最大的红包为:两倍的平均红包大小
        double max=(restMoney/restNum) * 2;

        //产生[0,1)之间的随机数
        double r=random.nextDouble();

        //抢到的红包区间[0,max)
        double money = r * max;
        if(money<0.01)
            money = 0.01;
        else 
            money= Math.floor(money*100)/100;        

        res.add(money);

        restNum--;
        restMoney -= money; 
    }   

    //最后一个红包为剩余余额
    res.add(Math.floor(restMoney*100)/100 );
    return res;
}
}
#!user/bin/env python
#-*- coding utf-8 -*-
# author:liruikun
import random
# summoney=input("please input the amount of money:")
# divide_n=input("divide into?:")

def hongbao(money,n):
    k=n
    sum=0#sum为前n个人抢得的总和,为了方便计算最后一个人的金额,初始值为0
    round=n#剩余人次
    while k>1:
        current_money = money  # 当前剩余的钱,初始值为money
        for i in range(1,n+1):
            get_money=random.randint(0,int(2*current_money/round))
            print('id[%s] have geted money %s'%(i,get_money))
            current_money -= get_money
            round -= 1
            sum += get_money
            k-=1


    if k==1:#最后一个人,分得剩余的所有
        print('id[%s] have geted money %s'%(n,money-sum))
    print(current_money)
hongbao(100,10)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 抢红包大家都知道,但发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则? 所有人抢到金额之和等于红包金额,不...
    小道萧兮阅读 4,495评论 0 3
  • (六十二)小遗憾 (六十三)不羁本色 领着昭汐与阿蕾两位大美人进了庆云宫,拜见完在座的长辈与各宫娘娘,我倚在老太太...
    笔间流年阅读 261评论 0 1
  • 书的标题《流星旅行车》和腰封的“希望今夜就能死去”这样的“旅行”“死亡”标签让我很容易联想到同是日本作家的作品《银...
    Holmew阅读 326评论 0 0
  • 今日任务目标:写15个标题 [if !supportLists]1.[endif]SAT阅读如何备考?各类型题有何...
    sanshuimei003阅读 334评论 1 0
  • 相约读书打卡第85天,我是来自山西朔州的苑九芬,今天读书内容是《非暴力沟通》后记的内容摘要。 关切地倾听他人,而不...
    苑九芬家庭教育心理咨询阅读 122评论 0 1