权重随机算法

一个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 dict = new Dictionary();

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

/// 
/// 按权重获取数据
/// 
/// 一次获取几个
/// 
public int[] GetDatas(int count)
{
    List> sortList = new List>();

    for (int i = 0; i < datas.Length; i++)
    {
        int key = datas[i];
        int value = Random.Range(1, 100) * widgets[i];
        sortList.Add(new KeyValuePair(key, value));
    }

    sortList.Sort((kvp1, kvp2) =>
    {
        return kvp2.Value - kvp1.Value;
    });

    List result = new List();

    foreach (KeyValuePair kvp in sortList.GetRange(0, count))
    {
        result.Add(kvp.Key);
    }

    return result.ToArray();
}

/// 
/// 排序集合
/// 
/// 
/// 
private List> SortByValue(Dictionary dict)
{
    List> list = new List>();

    if (dict != null)
    {
        list.AddRange(dict);

        list.Sort(
            delegate (KeyValuePair kvp1, KeyValuePair kvp2)
            {
                return kvp2.Value - kvp1.Value;
            });
    }
    return list;
}

}

你可能感兴趣的:(基础数学算法)