Java紅包拆分均勻拆分和隨機(jī)拆分

Java紅包拆分均勻拆分和隨機(jī)拆分

紅包拆分的策略:

  1. 普通紅包(平均)
  2. 手氣紅包(隨機(jī))

分析:

  1. 現(xiàn)實(shí)的紅包都是以分為最小的計(jì)算單位,我們把發(fā)送的總金額totalMoney轉(zhuǎn)換為分的整數(shù)(int)類(lèi)型钠乏。

  2. 平均分配會(huì)遇到總金額除不盡的方法酥泞,通過(guò)把最后的余數(shù)放到最后一個(gè)包的做法吵血,較為妥當(dāng)尖殃。

  3. 隨機(jī)紅包以故,避免每個(gè)包差距太大坦弟,我們要確保每次分發(fā)的包最多不超過(guò)余下所要分發(fā)平均數(shù)的2倍护锤。

  4. 要確保每一個(gè)包中至少有0.01元。

  5. 綜合3酿傍、4得出每次分發(fā)的計(jì)算公式 :
    1 + random.nextInt(leftMoney / leftCount * 2)

  6. leftMoney (分發(fā)剩余的錢(qián))烙懦、leftCount(剩余需要分發(fā)的份數(shù)),將分發(fā)剩余的最后一份放到最后的一個(gè)包赤炒。

  • Java 參考代碼:

    import java.util.ArrayList;
    import java.util.Random;
    
    public class RandomSplit {
        public static void main(String[] args) {
            // 測(cè)試代碼
            ArrayList<Integer> list = new ArrayList();
            list = randomDivide(20, 3);
            for (int i = 0; i < list.size(); i++) {
                System.out.println((double) list.get(i) / 100);
            }
        }
    
        
        /****
         * 紅包拆分方法
         * @param money  被拆分的總金額 (單位元)
         * @param count      被拆分的紅包個(gè)數(shù)
         * @return 拆分后的每個(gè)紅包金額數(shù)組
         */
    
    
        public static ArrayList<Integer> randomDivide(double money, int count) {
    
            // 創(chuàng)建一個(gè)長(zhǎng)度的紅包數(shù)組
            ArrayList<Integer> redList = new ArrayList<>();
    
            // 由于double的精度分體將其轉(zhuǎn)換為int計(jì)算, 即將元轉(zhuǎn)換為分計(jì)算氯析,紅包最小單位以分計(jì)算
            int totalMoney = (int) (money * 100);
    
            // 判斷紅包的總金額
            if (money > 200) {
                System.out.println("單個(gè)紅包不能超過(guò)200元");
                return redList; // 返回空的紅包集合
            }
            if (totalMoney < count || totalMoney < 1) {
                System.out.println("被拆分的總金額不能小于0.01元");
                return redList; // 返回空的紅包集合
            }
    
            //2. 進(jìn)行隨機(jī)分配
            Random rand = new Random();
    
            int leftMoney = totalMoney;  // 剩余金額
            int leftCount = count;  // 剩余份數(shù)
            // 隨機(jī)分配公式:1 + rand.nextInt(leftMoney / leftCount * 2);
            for (int i = 0; i < count - 1; i++) {
                int money_ = 1 + rand.nextInt(leftMoney / leftCount * 2);
                redList.add(money_);
                leftMoney -= money_;
                leftCount--;
            }
            // 把剩余的最后一個(gè)放到最后一個(gè)包里
            redList.add(leftMoney);
            return redList;
        }
    
        public static ArrayList<Integer> averageDivide(double money, int count) {
            // 創(chuàng)建一個(gè)長(zhǎng)度的紅包數(shù)組
            ArrayList<Integer> redList = new ArrayList<>();
    
            // 由于double的精度分體將其轉(zhuǎn)換為int計(jì)算, 即將元轉(zhuǎn)換為分計(jì)算,紅包最小單位以分計(jì)算
            int totalMoney = (int) (money * 100);
    
            int avg = totalMoney / count;
            int mod = totalMoney % count;
    
            for (int i = 0; i < count - 1; i++) {
                redList.add(avg);
            }
            redList.add(avg + mod);
            return redList;
        }
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莺褒,一起剝皮案震驚了整個(gè)濱河市掩缓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遵岩,老刑警劉巖你辣,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舍哄,警方通過(guò)查閱死者的電腦和手機(jī)宴凉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蠢熄,“玉大人跪解,你說(shuō)我怎么就攤上這事∏┛祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵窘行,是天一觀的道長(zhǎng)饥追。 經(jīng)常有香客問(wèn)我,道長(zhǎng)罐盔,這世上最難降的妖魔是什么但绕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮惶看,結(jié)果婚禮上捏顺,老公的妹妹穿的比我還像新娘。我一直安慰自己纬黎,他們只是感情好幅骄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著本今,像睡著了一般拆座。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冠息,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天挪凑,我揣著相機(jī)與錄音,去河邊找鬼逛艰。 笑死躏碳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的散怖。 我是一名探鬼主播菇绵,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杭抠!你這毒婦竟也來(lái)了脸甘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偏灿,失蹤者是張志新(化名)和其女友劉穎丹诀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铆遭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年硝桩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枚荣。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碗脊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄妆,到底是詐尸還是另有隱情衙伶,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布害碾,位于F島的核電站矢劲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏慌随。R本人自食惡果不足惜芬沉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阁猜。 院中可真熱鬧丸逸,春花似錦、人聲如沸剃袍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)笛园。三九已至隘击,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間研铆,已是汗流浹背埋同。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棵红,地道東北人凶赁。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逆甜,于是被迫代替她去往敵國(guó)和親虱肄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 回溯算法 回溯法:也稱為試探法交煞,它并不考慮問(wèn)題規(guī)模的大小咏窿,而是從問(wèn)題的最明顯的最小規(guī)模開(kāi)始逐步求解出可能的答案,并...
    fredal閱讀 13,658評(píng)論 0 89
  • Java經(jīng)典問(wèn)題算法大全 /*【程序1】 題目:古典問(wèn)題:有一對(duì)兔子素征,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子集嵌,小兔子...
    趙宇_阿特奇閱讀 1,869評(píng)論 0 2
  • 貪心算法 貪心算法總是作出在當(dāng)前看來(lái)最好的選擇萝挤。也就是說(shuō)貪心算法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上...
    fredal閱讀 9,231評(píng)論 3 52
  • 50道經(jīng)典Java編程練習(xí)題根欧,將數(shù)學(xué)思維運(yùn)用到編程中來(lái)怜珍。抱歉哈找不到文章的原貼了,有冒犯的麻煩知會(huì)聲哈~ 1.指數(shù)...
    OSET我要編程閱讀 6,960評(píng)論 0 9
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類(lèi)型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 3,343評(píng)論 0 2