一个Test类的Start方法,用于测试
实例化一个 RandomControllerEx ,传入数据与数据对应的权重值。
GetDatas方法可以获取到当前这一次随机的值。
思路就是将权重值乘一个1到100的随机数,然后将随机后的权重值排序。
[code]csharpcode:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
private void Start()
{
RandomControllerEx rcEx = new RandomControllerEx(new int[] { 0, 1, 2, 3 }, new int[] { 60, 30, 10, 3 });
Dictionary<int, int> dict = new Dictionary<int, int>();
for (int i = 0; i < 10000; i++)
{
int[] resultData = rcEx.GetDatas(1);
if (dict.ContainsKey(resultData[0]))
dict[resultData[0]] += 1;
else
dict[resultData[0]] = 1;
}
foreach (var xxx in dict)
{
Debug.Log("key:[" + xxx.Key + "] value:[" + (xxx.Value * 1.0f / 103));
}
}
}
public class RandomControllerEx
{
int[] datas;
int[] widgets;
public RandomControllerEx(int[] datas, int[] widgets)
{
if (datas == null || widgets == null)
{
Debug.LogError("datas or widgets is null");
return;
}
if (datas.Length != widgets.Length)
{
Debug.LogError("must has same count");
return;
}
this.datas = datas;
this.widgets = widgets;
}
/// <summary>
/// 按权重获取数据
/// </summary>
/// <param name="count">一次获取几个</param>
/// <returns></returns>
public int[] GetDatas(int count)
{
List<KeyValuePair<int, int>> sortList = new List<KeyValuePair<int, int>>();
for (int i = 0; i < datas.Length; i++)
{
int key = datas[i];
int value = Random.Range(1, 100) * widgets[i];
sortList.Add(new KeyValuePair<int, int>(key, value));
}
sortList.Sort((kvp1, kvp2) =>
{
return kvp2.Value - kvp1.Value;
});
List<int> result = new List<int>();
foreach (KeyValuePair<int, int> kvp in sortList.GetRange(0, count))
{
result.Add(kvp.Key);
}
return result.ToArray();
}
/// <summary>
/// 排序集合
/// </summary>
/// <param name="dict"></param>
/// <returns></returns>
private List<KeyValuePair<int, int>> SortByValue(Dictionary<int, int> dict)
{
List<KeyValuePair<int, int>> list = new List<KeyValuePair<int, int>>();
if (dict != null)
{
list.AddRange(dict);
list.Sort(
delegate (KeyValuePair<int, int> kvp1, KeyValuePair<int, int> kvp2)
{
return kvp2.Value - kvp1.Value;
});
}
return list;
}
}