权重随机算法

一个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;
}

}

猜你喜欢

转载自blog.csdn.net/strivero/article/details/83545817