Unity圆盘抽奖(轮盘赌)代码,思路

在这里插入图片描述

思路

1.初始化:确定有几个扇形区域,每个区域有多大,算出每个区域占比分别是多少。
2.判断 :设定一个随机数(0~1),判断随机数在圆盘的那个区域中。
3.提高准确性,杜绝偶然性,重复n次第2步。得到进入次数最多的区域。(好比扔硬币,扔10次,可能10次正面,但要是扔足够多次数,1w次,10w次,次数越多越无限接近于50%,即真正的概率)

实现

1.定义字段

	 //试验次数
    public int experimentNum;
    //扇形区域的占比,设定时使用整数即可,初始化时将其计算为百分比。
    public List<float> p = new List<float>();
    //存储试验结果的字典
    private Dictionary<int, int> resultDic = new Dictionary<int, int>();

2.初始化

  public void Init()
    {
        //若未设置试验次数,则设置为和扇形数量一样
        if (experimentNum == 0)
            experimentNum = p.Count;
		//计算扇形区域总数
		//初始化试验结果字典
		float sum = 0;

		for (int i = 0; i < p.Count; i++)
        {
            sum += p[i];
            resultDic.Add(i,0);
        }

        //计算扇形区域占比
        for (int i = 0; i < p.Count; i++)
        {
            p[i] /= sum;
        }
    }

3.抽奖

public int GetNum()
    {
        //清零结果字典
        for (int i = 0; i < resultDic.Count; i++)
        {
            resultDic[i] = 0;
        }
		//实验experimentNum次
		for (int j = 0; j < experimentNum; j++)
        {
            float m = 0;
            float r = Random.Range(0f, 1f);
            //单次抽奖逻辑,看随机数r落在哪个扇形区间。
            for (int i = 0; i < p.Count; i++)
            {
                m += p[i];//用m记录已经走过的扇形区域和当前扇形区域。
                if (r <= m)
                {
                    resultDic[i] += 1;
                    break;
                }
            }
        }

        //从所有试验结果中,找出第一个出现的次数最多的试验结果
        int mResultId = 0;
        int mResult = 0;
        for (int i = 0; i < resultDic.Count; i++)
        {
            if (mResult < resultDic[i])
            {
                mResult = resultDic[i];
                mResultId = i;
            }
        }
        Debug.Log(mResultId);

        return mResultId;
    }

全部代码

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

public class RouletteControl : MonoBehaviour
{
    //试验次数
    public int experimentNum;
    //扇形区域的占比,设定时使用整数即可,初始化时将其计算为百分比。
    public List<float> p = new List<float>();
    //存储试验结果的字典
    private Dictionary<int, int> resultDic = new Dictionary<int, int>();
    public void Init()
    {
        //若未设置试验次数,则设置为和扇形数量一样
        if (experimentNum == 0)
            experimentNum = p.Count;
		//计算扇形区域总数
		//初始化试验结果字典
		float sum = 0;

		for (int i = 0; i < p.Count; i++)
        {
            sum += p[i];
            resultDic.Add(i,0);
        }

        //计算扇形区域占比
        for (int i = 0; i < p.Count; i++)
        {
            p[i] /= sum;
        }
    }
    public int GetNum()
    {
        //清零结果字典
        for (int i = 0; i < resultDic.Count; i++)
        {
            resultDic[i] = 0;
        }
		//实验experimentNum次
		for (int j = 0; j < experimentNum; j++)
        {
            float m = 0;
            float r = Random.Range(0f, 1f);
            //单次抽奖逻辑,看随机数r落在哪个扇形区间。
            for (int i = 0; i < p.Count; i++)
            {
                m += p[i];//用m记录已经走过的扇形区域和当前扇形区域。
                if (r <= m)
                {
                    resultDic[i] += 1;
                    break;
                }
            }
        }

        //从所有试验结果中,找出第一个出现的次数最多的试验结果
        int mResultId = 0;
        int mResult = 0;
        for (int i = 0; i < resultDic.Count; i++)
        {
            if (mResult < resultDic[i])
            {
                mResult = resultDic[i];
                mResultId = i;
            }
        }
        Debug.Log(mResultId);

        return mResultId;
    }
    

   
}

在这里插入图片描述
在这里插入图片描述

百度云接:https://pan.baidu.com/s/1MxHQBdZDjUUaTaqMDwTGEg 密码:k3cs

如果文章对你有帮助,不妨关注我一下,点个赞。
我会一直分享Unity开发中解决的坑,分享学到的技术,也会分享读书心得和理财心得,谢谢大家。

发布了12 篇原创文章 · 获赞 2 · 访问量 2586

猜你喜欢

转载自blog.csdn.net/boyZhenGui/article/details/104043563