我在网上发现居然找不到,都是转盘滚轮什么的抽奖,没有这种随机生成类似十连抽性质的代码
使用方法
SortedDictionary<string, int> monsterProb = new SortedDictionary<string, int>
{
{"king", 5 },
{"archer",15 },
{"mage",10 },
{"warrior",20 },
{"base",50 },
};
//返回怪物名字
string mosterName = Lottery.GetLottery(monsterProb);
//通过怪物名字获取资源,characterFactory.LoadPlayer这是我自己写的
monster=characterFactory.LoadPlayer(mosterName);
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class Lottery
{
//奖品总数
private static int prizeNum;
//键数组
private static List<string> keyList = new List<string>();
//奖品概率区间的最大值
private static List<int> betweenMax = new List<int>();
/// <summary>
/// 依照概率随机返回一个字符串
/// 使用SortedDictionary是因为后面两个List需要对应上,通过SortedDictionary给List赋值时要有顺序
/// 总体思路
/// 遍历SortedDictionary的值,算出奖品总数(也就是概率的分母)
/// 累加时顺便记录每次相加的值(也就是边界值)
/// 随机产生一个范围在零到奖品总数的数,和边界值比较,边界值对应上要输出的值
/// </summary>
/// <param name="sortedDictionary">存储了名字和概率的SortedDictionary</param>
/// <returns></returns>
public static string GetLottery(SortedDictionary<string, int> sortedDictionary)
{
//由于设置了静态,所以每次执行都需要清零
prizeNum = 0;
keyList.Clear();
betweenMax.Clear();
//加0是为了后面好对范围进行判断,像五个范围有六个点这种意思
betweenMax.Add(0);
//存储键值键值,方便返回抽中的名字
keyList = sortedDictionary.Keys.ToList();
//插入任意值都行,主要为了使keyList和num能够对应,通过相同下标可以调用对应值
keyList.Insert(0, "0");
foreach (int value in sortedDictionary.Values)
{
//计算奖品总数
prizeNum += value;
//存储奖品概率区间的最大值,方便比较
betweenMax.Add(prizeNum);
}
//C#中的随机数
//Random rnd = new Random(Guid.NewGuid().GetHashCode());
//int i = rnd.Next(0, max);
int i = Random.Range(0, prizeNum);
for (int j = 0; j < sortedDictionary.Count; j++)
{
//判断是否在范围内,要看产生的数包不包括上限,包括的话上限减一,值为上限时返回空,并且概率也不准了
if (betweenMax[j] <= i && i < betweenMax[j + 1])
{
//由于keyList和num是对应的,通过下标可以直接返回对应字符串
return keyList[j + 1];
}
}
return "";
}
}
总觉得还有什么更好的方法,但我一时半会又想不出,就结果来看还行.