模擬微信搶紅包demo,生成隨機數
概述
經常搶紅包會發現,很大的概率是在一開始得時候搶的紅包越大,越靠後越小(大概率是這種情況,這是我的經驗之談,也不是一定的)。
對於金額是如何確定的,我們可大概猜測是在使用者提交之後就確定的數值,也可以是在使用者每次點選的時候觸發,確定金額。這兩種方式並沒有本質的區別。但是對於金額的確定方式,我猜測是用隨機數生成的。
大概思路一開始的時候,隨機數取值的範圍較大,出現大數的可能性更大。越往後可分配金額越少,故而金額越小(不一定,下面的demo也多次出現後面大金額的情況,我都要懷疑我的猜想了)
下面先解釋一下生成隨機數有兩種方式:Math.random()方法和Random類
然後再分析一下搶紅包的原始碼
隨機數方法方法
Math.random()方法
該方法預設生成大於等於0.0小於1.0的double型隨機數,即0<=Math.random()<=1.0,雖然只能生成0~1之間的數字,但是隻要是在後面乘上一個範圍值,就可以表示任意範圍的數。
(int)(Math.Random()*n) ===>返回大於等於0小於n的隨機數
m+(int)(Math.Random()*n) ===>返回大於等於m小於m+n(不包括m+n)的隨機數
下面以一個猜數字遊戲來舉例說明
/**
* 猜數字遊戲
*/
import java.util.Scanner;
public class NumGame {
public static void main(String[] args) {
System.out.println("——————猜數字遊戲——————\n");
int iNum;
int iGuess;
Scanner in = new Scanner(System.in);// 建立掃描器物件,用於輸入
iNum = (int) (Math.random() * 100);// 生成1到100之間的隨機數
System.out.print("請輸入你猜的數字:");
iGuess = in.nextInt(); // 輸入首次猜測的數字
while ((iGuess != -1) && (iGuess != iNum))// 判斷輸入的數字不是-1或者基準數
{
if (iGuess < iNum)// 若猜測的數字小於基準數,則提示使用者輸入的數太小,並讓使用者重新輸入
{
System.out.print("太小,請重新輸入:");
iGuess = in.nextInt();
} else// 若猜測的數字大於基準數,則提示使用者輸入的數太大,並讓使用者重新輸入
{
System.out.print("太大,請重新輸入:");
iGuess = in.nextInt();
}
}
if (iGuess == -1)// 若最後一次輸入的數字是-1,迴圈結束的原因是使用者選擇退出遊戲
{
System.out.println("退出遊戲!");
} else// 若最後一次輸入的數字不是-1,使用者猜對數字,獲得成功,遊戲結束
{
System.out.println("恭喜你,你贏了,猜中的數字是:" + iNum);
}
System.out.println("\n———————遊戲結束———————");
}
}
Random類
除了Math類中的random方法外,Java中還提供了一種可以獲取隨機數的方式,那就是Java.util.Random類,該類表示一個隨機數生成器,可以通過例項化一個Random物件來建立一個隨機數生成器。
這種方式例項化物件時,Java編譯器一系統當前時間作為隨機數生辰器的種子,因為每時每刻的時間不可能相同,所以生成的隨機數將不同,但是如果執行速度太快,也會生成兩次執行結果相同的隨機數。
同時還提供了各種型別隨機數的方法,如下表。
方法 | 返回值 | 功能描述 |
---|---|---|
nextInt() | int | 返回一個隨機整數 |
nextInt(int n) | int | 返回一個大於0小於n的隨機整數 |
nextLong() | long | 返回一個隨機長整型值 |
nextBoolean() | boolean | 返回一個隨機布林型值 |
nextFloat() | float | 返回一個隨機浮點型值 |
nextDouble() | double | 返回一個隨機雙精度型值 |
nextGaussian() | double | 返回一個概率密度為高斯分佈的雙精度值 |
搶紅包!!
import java.text.DecimalFormat;
import java.util.Random;
import java.util.Scanner;
/**
* 模擬微信搶紅包功能
*/
public class RedBags { //建立一個RedBags類
public static void main(String[] args) {
System.out.println("—————————模擬微信搶紅包—————————\n");
Scanner sc = new Scanner(System.in); //控制檯輸入
System.out.print("請輸入要裝入紅包的總金額(元):");
double total = sc.nextDouble(); //輸入“紅包的總金額”
System.out.print("請輸入紅包的個數(個):");
int bagsnum = sc.nextInt(); //輸入“紅包的個數”
double min = 0.01; //初始化“紅包的最小金額”
Random random = new Random(); //建立隨機數物件random
DecimalFormat df = new DecimalFormat("###,###,###.##"); //建立DecimalFormat類的物件df,並設定格式
for (int i = 1; i < bagsnum; i++) { //設定“迴圈”,邊界值是紅包數-1
//保證後面至少有(bagsnum - i) 個 最小金額可以發
double safe = (total - (bagsnum - i) * min) / (bagsnum - i); //通過公式模擬數學中的離散模型
double money = (double) random.nextInt((int) ((safe - min) * 100)) / 100 + min; //根據離散模型得到每個紅包的金額
total = total - money; //替換total的值
String temp = df.format(money); //呼叫format()方法,對數字money格式化
System.out.println("第" + i + "個紅包:" + temp + "元"); //輸出結果
}
String left = df.format(total); //呼叫format()方法,對數字total格式化
//輸出最後一個紅包
System.out.println("第" + bagsnum + "個紅包:" + left + "元"); //輸出結果
sc.close(); //關閉控制檯輸入
}
}
相關文章
- 微信小程式生成隨機數微信小程式隨機
- 微信搶紅包遊戲繞過指定尾數遊戲
- 分享一個仿微信模擬器,可以快速模擬微信對話,微信紅包等。
- 微信搶紅包遊戲繞過指定尾數(2)遊戲
- C4top-搶紅包 (模擬-結構體排序)結構體排序
- 高仿微信搶紅包動畫特效動畫特效
- 生成隨機數隨機
- 微信小程式搶紅包實現效果微信小程式
- JavaScript 生成隨機數JavaScript隨機
- mysql生成隨機數MySql隨機
- python生成隨機數、隨機字串Python隨機字串
- Python教你全自動搶微信紅包Python
- 藍橋杯-奪冠概率模擬(取隨機數)隨機
- [隨機數詳解]生成一個隨機數,生成指定範圍的隨機數及隨機陣列去重隨機陣列
- 微信小程式搶紅包高併發設計微信小程式
- Android微信新版全自動搶紅包助手Android
- 隨機數生成器隨機
- java隨機數生成原理Java隨機
- 生成隨機整數方法隨機
- python 隨機數生成Python隨機
- C++生成隨機數C++隨機
- Linux Shell 生成隨機數和隨機字串Linux隨機字串
- 微信紅包的隨機演算法是怎樣實現的?隨機演算法
- 開發微信搶紅包軟體被罰475萬!
- 更安全的隨機數生成隨機
- 幾種生成隨機數方法隨機
- 使用Math類生成隨機數隨機
- matlab 生成隨機數序列Matlab隨機
- 無重複隨機數生成隨機
- PHP 生成更好的隨機數PHP隨機
- 在oracle 中生成隨機數Oracle隨機
- Matlab 隨機生成兩個數值之間的隨機數Matlab隨機
- Redis秒殺系統架構設計-微信搶紅包Redis架構
- 新體驗,Apple Watch 也能搶微信紅包了!APP
- Golang生成區間隨機整數Golang隨機
- Python生成隨機數random模組Python隨機random
- 巧用物件,生成不重複隨機數物件隨機
- Python中如何生成隨機數?Python隨機