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开发中解决的坑,分享学到的技术,也会分享读书心得和理财心得,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真鬼123

祝你节节高升岁岁平安越来越漂亮

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值