游戏掉落概率算法

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

    }
}

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

  • 7
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值