欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

游戏掉落概率算法

程序员文章站 2022-07-13 08:35:18
...

游戏开发中我们经常会用到物品掉落概率这个算法,比如打怪掉不掉宝物,掉落的是何种宝物,这个都需要概率来控制的,在实际项目中抽奖系统有的也会采用跟掉落概率相似的算法。并且,抽奖系统的概率可能还会随着抽奖人数的变化而不断调整,这个虽然看起来有点复杂,其实只是多了逻辑,如果知道普遍的掉落概率算法,那么我相信这种可控的概率算法也是很简单的。掉率概率的原理很简单,就是基本高中概率知识,原理如下:假设有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);

    }
}

实验结果:一万次的模拟结果各个球的出现次数基本满足模拟总次数*各自概率 。如果觉得算法有问题大家可以交流。