游戏掉落概率算法

来源:互联网 发布:赤兔软件 编辑:程序博客网 时间:2024/04/27 15:05
游戏开发中我们经常会用到物品掉落概率这个算法,比如打怪掉不掉宝物,掉落的是何种宝物,这个都需要概率来控制的,在实际项目中抽奖系统有的也会采用跟掉落概率相似的算法。并且,抽奖系统的概率可能还会随着抽奖人数的变化而不断调整,这个虽然看起来有点复杂,其实只是多了逻辑,如果知道普遍的掉落概率算法,那么我相信这种可控的概率算法也是很简单的。掉率概率的原理很简单,就是基本高中概率知识,原理如下:

假设有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);    }}

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

0 0
原创粉丝点击