日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java实现红包要多少钱_Java实现抢红包算法,附完整代码(公平版和手速版)

發(fā)布時(shí)間:2023/12/4 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java实现红包要多少钱_Java实现抢红包算法,附完整代码(公平版和手速版) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)我們?cè)谌豪飺尲t包時(shí)真的是手速越快紅包金額越大嗎?

答案當(dāng)然是并不是,都說了是拼手氣,豈能是拼手速!

不過也可以有拼手速的方法

二倍均值法(公平版)

這是一種很合理很公平的搶紅包算法了,絕對(duì)不會(huì)讓你拼手速的,就別天真了。

在此我們假設(shè)

紅包剩余金額為 M

紅包剩余數(shù)量為 N

這種算法就是每次都在區(qū)間[0,M/N×2] 隨機(jī)取一個(gè)數(shù)

假設(shè)100元紅包發(fā)10個(gè)人,那么合理的做法應(yīng)該是每個(gè)人領(lǐng)到10元的概率相同。

第一個(gè)人隨機(jī)金額的范圍為[0,100/10×2] ,也就是[0,20],這樣平均可以領(lǐng)到10元,此時(shí)剩余金額為100-10=90。

第二個(gè)人隨機(jī)金額的范圍為[0,90/9×2] ,也就是[0,20],這樣平均也可以領(lǐng)到10元,此時(shí)剩余金額為90-10=80。

第三個(gè)人隨機(jī)金額的范圍為[0,80/8×2] ,也就是[0,20],這樣平均也可以領(lǐng)到10元。

這樣推導(dǎo)下去,每個(gè)人領(lǐng)到相同金額的概率應(yīng)該就是相同的了。

代碼:

public static ListdoubleMeanMethod(double money,int number){

Listresult = new ArrayList();

if(money<0&&number<1)

return null;

double amount,sum=0;

int remainingNumber=number;

int i=1;

while(remainingNumber>1){

amount= nextDouble(0.01,2*(money/remainingNumber));

sum+=amount;

System.out.println("第"+i+"個(gè)人領(lǐng)取的紅包金額為:"+format(amount));

money -= amount;

remainingNumber--;

result.add(amount);

i++;

}

result.add(money);

System.out.println("第"+i+"個(gè)人領(lǐng)取的紅包金額為:"+format(money));

sum+=money;

System.out.println("驗(yàn)證發(fā)出的紅包總金額為:"+format(sum));

return result;

}

運(yùn)行結(jié)果:

線段切割法(手速版)

這就是拼手速了,是時(shí)候展示手速了。

這個(gè)算法可以把總金額想象成一條線段,每個(gè)人都有機(jī)會(huì)切一刀,前面的人切剩下的后面的人再接著切,這樣越是前面的人截取的長度(理解成領(lǐng)取到的紅包金額)越大的概率就越大。

代碼:

public static void lineSegmentCutting(double money,int number){

if(money<0&&number<1)

System.out.println("輸入錯(cuò)誤!");

double begin=0,end=money;

double y=0;

for(int i=0;i

double nn=0;

double amount=nextDouble(begin,end);

nn=amount-begin;

System.out.println("第"+(i+1)+"個(gè)人領(lǐng)取的紅包金額為:"+format(nn));

y+=nn;

begin=amount;

}

System.out.println("第"+number+"個(gè)人領(lǐng)取的紅包金額為:"+format(end-begin));

y+=(end-begin);

System.out.println("驗(yàn)證發(fā)出的紅包總金額為:"+format(y));

}

運(yùn)行結(jié)果:

完整代碼:

package com.zhl.blogTest;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.Scanner;

public class redEnvelope {

/*Random 隨機(jī)生成一個(gè)區(qū)間在[min , max]的數(shù)值

randNumber 將被賦值為一個(gè) MIN 和 MAX 范圍內(nèi)的隨機(jī)數(shù)

int randNumber =rand.nextInt(MAX - MIN + 1) + MIN; */

/**

生成min到max范圍的浮點(diǎn)數(shù)

**/

public static double nextDouble(final double min, final double max) {

return min + ((max - min) * new Random().nextDouble());

}

public static String format(double value) {

return new java.text.DecimalFormat("0.00").format(value); // 保留兩位小數(shù)

}

//二倍均值法

public static ListdoubleMeanMethod(double money,int number){

Listresult = new ArrayList();

if(money<0&&number<1)

return null;

double amount,sum=0;

int remainingNumber=number;

int i=1;

while(remainingNumber>1){

amount= nextDouble(0.01,2*(money/remainingNumber));

sum+=amount;

System.out.println("第"+i+"個(gè)人領(lǐng)取的紅包金額為:"+format(amount));

money -= amount;

remainingNumber--;

result.add(amount);

i++;

}

result.add(money);

System.out.println("第"+i+"個(gè)人領(lǐng)取的紅包金額為:"+format(money));

sum+=money;

System.out.println("驗(yàn)證發(fā)出的紅包總金額為:"+format(sum));

return result;

}

//線段切割法

public static void lineSegmentCutting(double money,int number){

if(money<0&&number<1)

System.out.println("輸入錯(cuò)誤!");

double begin=0,end=money;

double y=0;

for(int i=0;i

double nn=0;

double amount=nextDouble(begin,end);

nn=amount-begin;

System.out.println("第"+(i+1)+"個(gè)人領(lǐng)取的紅包金額為:"+format(nn));

y+=nn;

begin=amount;

}

System.out.println("第"+number+"個(gè)人領(lǐng)取的紅包金額為:"+format(end-begin));

y+=(end-begin);

System.out.println("驗(yàn)證發(fā)出的紅包總金額為:"+format(y));

}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.println("這是一段模擬搶紅包的代碼。");

int number;

double money;

System.out.print("請(qǐng)輸入紅包總金額:");

money = sc.nextDouble();

System.out.print("請(qǐng)輸入紅包數(shù)量:");

number = sc.nextInt();

//System.out.println(money + " " + number);

//二倍均值法

doubleMeanMethod(money,number);

//System.out.println(doubleMeanMethod(money,number).toString());

//也是可以直接輸出list的,為了觀察方便,我就在循環(huán)中輸出了,存在list里主要是為了后續(xù)方便數(shù)據(jù)的使用

System.out.println();

//線段切割法

lineSegmentCutting(money,number);

}

}

來源:http://suo.im/5Fyatk

最近整理一套Java學(xué)習(xí)資料,包括了Java語法、面向?qū)ο蟆惓!⒊S妙悺⒓稀O流、多線程、網(wǎng)絡(luò)編程、JUnit、枚舉、注解、反射機(jī)制、CSS、HTML、JavaScript、JQuery、ajax、Javaweb、MySQL、JavaEE、SSM框架、springboot、算法、Git、maven、Linux、設(shè)計(jì)模式、多線程與高并發(fā)、視頻教程、視頻源碼、實(shí)戰(zhàn)項(xiàng)目、電子書、簡歷模板、高頻面試題等等資源,需要的朋友可以關(guān)注公眾號(hào):有故事的程序員!

總結(jié)

以上是生活随笔為你收集整理的java实现红包要多少钱_Java实现抢红包算法,附完整代码(公平版和手速版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。