1. 程式人生 > >遊戲掉落概率演算法

遊戲掉落概率演算法

遊戲開發中我們經常會用到物品掉落概率這個演算法,比如打怪掉不掉寶物,掉落的是何種寶物,這個都需要概率來控制的,在實際專案中抽獎系統有的也會採用跟掉落概率相似的演算法。並且,抽獎系統的概率可能還會隨著抽獎人數的變化而不斷調整,這個雖然看起來有點複雜,其實只是多了邏輯,如果知道普遍的掉落概率演算法,那麼我相信這種可控的概率演算法也是很簡單的。掉率概率的原理很簡單,就是基本高中概率知識,原理如下:假設有Blue,red,yellow,black,white,gray 這六種顏色的球,他們掉落的概率分別是0.05f,0.1f,0.1f,0.2f,0.25f,0.3f,然後他們的概率和是1,我們在一個長度為1的線段上畫出這個量,如下:
這裡寫圖片描述


原理非常簡單,也很好理解,具體的實現程式碼如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Probability : MonoBehaviour
{
    private float[] ProbabilityValue;
    Dictionary<int, string> ObjectValue = new Dictionary<int, string>();
    private void  Init()
    {
        ProbabilityValue = new
float[6]{0.05f,0.1f,0.1f,0.2f,0.25f,0.3f}; } private void IntProbabilityValue() { ObjectValue.Add(0,"Blue"); ObjectValue.Add(1, "Red"); ObjectValue.Add(2, "Yellow"); ObjectValue.Add(3, "Black"); ObjectValue.Add(4, "White"); ObjectValue.Add(5, "Gray"
); } private int Inder(float[] ProbabilityValue) { float total = 0; //首先計算出概率的總值,用來計算隨機範圍 for (int i = 0; i < ProbabilityValue.Length; i++) { total += ProbabilityValue[i]; } Random rd = new Random(); float Nob = Random.Range(0,total); for (int i = 0; i < ProbabilityValue.Length; i++) { if (Nob < ProbabilityValue[i]) { return i; } else { Nob -= ProbabilityValue[i]; } } return ProbabilityValue.Length - 1; } //初始化 void Start() { Init(); IntProbabilityValue(); test(); } public void CreatObj() { string name = ObjectValue[Inder(ProbabilityValue)]; Debug.Log(name); } //這個是測試方法,測出1萬次模擬產生的各種球的數量。 private void test() { int Blue = 0; int Red = 0; int Yellow = 0; int Black = 0; int White = 0; int Gray = 0; for (int i=0;i<10000;i++) { string name = ObjectValue[Inder(ProbabilityValue)]; switch (name) { case "Blue": Blue++; break; case "Red": Red++; break; case "Yellow": Yellow++; break; case "Black": Black++; break; case "White": White++; break; case "Gray": Gray++; break; } } Debug.Log("Blue:"+ Blue+ "Red:"+ Red+ "Yellow:"+ Yellow+ "Black"+ Black+ "White:"+ White+ "Gray:"+ Gray); } }

實驗結果:一萬次的模擬結果各個球的出現次數基本滿足模擬總次數*各自概率 。如果覺得演算法有問題大家可以交流。

相關推薦

遊戲掉落概率演算法

遊戲開發中我們經常會用到物品掉落概率這個演算法,比如打怪掉不掉寶物,掉落的是何種寶物,這個都需要概率來控制的,在實際專案中抽獎系統有的也會採用跟掉落概率相似的演算法。並且,抽獎系統的概率可能還會隨著抽獎人數的變化而不斷調整,這個雖然看起來有點複雜,其實只是多了邏

遊戲 簡單概率演算法

有時候我們要在場景中生成寶箱或者陷阱,控制相應的生成機率 思路: 利用Random.range(0,100)來生成一個隨機數字,然後判斷隨機數是否小於某概率數字,如果小於則生成,否則不生成 注意,Ra

【BZOJ】3191 [JLOI2013]卡牌遊戲概率dp)

如果 style ++ bzoj mem color con size oid 題目 傳送門:QWQ 分析 算是概率dp不錯的題。 $ dp[i][j] $表示有i個人時,這i個人中的第j個獲勝的概率。 我們把i從1推到n,那麽答案就是$ dp[n

猜數字遊戲有感(演算法啟蒙)

python新手學習食用; 猜數字遊戲規則: 隨機產生一個1-100之間的整數,然後讓使用者猜這個數字,並讀取使用者的輸入。如果使用者輸入的不是1~100之間的整數或者輸入的帶有字母,則提示使用者輸入不合法,當用戶沒有猜對的時候,提示使用者的輸入太大或太小,並再次讀取使用者的輸入,當用戶猜對

LeetCode 跳躍遊戲 II 貪心演算法

給定一個非負整數陣列,你最初位於陣列的第一個位置。 陣列中的每個元素代表你在該位置可以跳躍的最大長度。 你的目標是使用最少的跳躍次數到達陣列的最後一個位置。 示例: 輸入: [2,3,1,1,4] 輸出: 2 解釋: 跳到最後一個位置的最小跳躍數是 2。   從下標為

BZOJ4820 SDOI2017硬幣遊戲概率期望+高斯消元+kmp)

  容易想到的做法是建出AC自動機,高斯消元。然而自動機上節點數量是nm的。   注意到我們要求的變數只有n個,考慮將其他不用求的節點合併為一個變數。這個變數即表示隨機生成一個串,其不包含任何一個模板串的概率。   現在即有n+1個變數,考慮列出n+1個方程。設pi表示第i個人勝利的概率,顯然有Σpi=1

關於抽獎的概率演算法

        @Test         public void test(){            

n皇后概率演算法與確定演算法折衷考慮最後解法

#include "pch.h" #include <iostream> #include <vector> #include <random> #include <ctime> #include <time.h>

201604-4遊戲【啟發式演算法 46ms】

注意點有如下幾個: 1.找最短路用bfs遍歷; 2.一開始我是用danger結構體記錄危險塊的物理位置和危險時間,然後每次進行遍歷,顯然,danger塊數∈[1,9999],地圖的最大規格是100x100,危險時間∈[0,100],極端情況下最短路徑最大會是300【為什麼會是300:結合

用蒙特卡洛方法計算小遊戲獲勝概率(Python實現)

遊戲描述: 有兩人X和Y,遊戲之前兩人分別擁有籌碼x個和y個,兩人開始進行每人獲勝概率都是50%的比拼,如果X贏了,並且之前x>=y,那麼遊戲結束,X獲勝;如果X贏了,但是之前x<y,則X的籌碼翻倍,變成2x,Y的籌碼變成y-x,遊戲繼續; 問:當x,y取不同值

概率演算法

思想: 根據概率統計的思路來解決問題,結果得到的是近似值;適合於那些沒有或者很難計算解析的問題; 概率演算法基本步驟: 1、將問題轉換為相應的集合圖形S,S的面積容易計算,問題的結果往往對應集合圖形中某一部分S1的面積; 2、然後向集合圖形中隨機撒點; 3、統計集合圖形S和S1中的點數,

【原創】演算法分享(4)Cardinality Estimate 基數計數概率演算法

讀過《程式設計珠璣》(<Programming Pearls>)的人應該還對開篇的Case記憶猶新,大概的場景是: 作者的一位在電話公司工作的朋友想要統計一段時間內不同的電話號碼的個數,電話號碼的數量很大,當時的記憶體很小,所以不能把所有的電話號碼全部放到記憶體來去重統計,他的朋友很苦惱。 作

學以致用——Java原始碼——騎士之旅(跳馬)小遊戲_優化演算法加彙總分析版(Knight’s Tour - Heuristic plus statistics version)

接上一篇,學以致用——Java原始碼——騎士之旅(跳馬)小遊戲_優化演算法版(Knight’s Tour - Heuristic version), https://blog.csdn.net/hpdlzu80100/article/details/85330188。 本程式加入了統計分

學以致用——Java原始碼——騎士之旅(跳馬)小遊戲_優化演算法版(Knight’s Tour - Heuristic version)

程式功能: 輸入騎士的起始位置,程式模擬輸出其移動軌跡(本程式採用優化演算法(Heuristic)但未使用蠻力解決法)。相比上一版本騎士“隨意”的選擇路勁,這次,武士受到了啟發,優先選擇靠邊的位置行走,所以可以走的更遠。但有時依然改變不了自己尚未完成使命(走完全部方格),卻被困在棋盤上某個位

經典抽獎概率演算法

php中獎概率演算法,可用於刮刮卡,大轉盤等抽獎演算法。用法很簡單,程式碼裡有詳細註釋說明,一看就懂 &lt;?php /* * 經典的概率演算法, * $proArr是一個預先設定的陣列, * 假設陣列為:array(100,200,300,400), * 開始是從1,1000 這個概

php 抽獎概率演算法

lottery.php &lt;?php //轉自https://segmentfault.com/a/1190000007431893 /* * 不同概率的抽獎原理就是把0到*(比重總數)的區間分塊 * 分塊的依據是物品佔整個的比重,再根據隨機數種子來產生0-* 中的某個數 * 判斷這

貪吃蛇遊戲設計及演算法

首先需要明確設計應該完成的功能,使用鍵盤的上下左右鍵來控制蛇的方向;隨機產生食物,蛇吃到食物後,身體變長一節;設定邊界,蛇撞到牆或者吃到自身的時候,遊戲結束。 以下是思路: 1.一張地圖,四周有牆體。 2.一條蛇,由蛇身和蛇頭組成。 3.食物,蛇吃到食物

[面經]阿里遊戲一面的演算法

前言:兩天前參加阿里遊戲的面試,一面時出了一道面試題。那時我看楞了,好像沒做過這種題型,看起來很容易又很難。很容易是,使用O(N^2)就可以解決,難得是,優化時間複雜度。 題目:字串

7款經典遊戲 詮釋高階演算法精髓

入門要求: 使用Java Swing進行圖形程式設計 課程導向 排序可序化 選擇排序 插入排序 歸併排序 快速排序 堆排序 概率模擬問題 蒙特卡洛演算法 走迷宮 DFS BFS 非遞迴

第六屆湖南省省賽 射擊遊戲概率博弈,dfs)

射擊遊戲 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 10  Solved: 6 [Submit][Status][Web Board] Description A和B在玩一個射擊遊戲,戰場由若干單位正方形積木組成。