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