根据权重配置随机

    /// 
    /// 不是每次都创建一个新的map,用于减少gc
    /// 
    private static readonly Dictionary _randomIntervalMap = new Dictionary();
    /// 
    /// 根据权重配置随机出一种结果。
    /// 
    /// 
    /// 
    public static object RandomObjectByWeight (Dictionary weightInfo) {
        object randomResult = null;
        //count the total weights.
        float weightSum = 0f;
        foreach (var item in weightInfo) {
            weightSum += item.Value;
        }
        //Debug.Log( "weightSum: " + weightSum );

        //value -> Vector2(min,max)
        _randomIntervalMap.Clear();
        //calculate the interval of each object.
        float currentWeight = 0f;
        foreach (var item in weightInfo) {
            float min = currentWeight;
            currentWeight += item.Value;
            float max = currentWeight;
            Vector2 interval = new Vector2(min, max);
            _randomIntervalMap.Add(item.Key, interval);
        }

        //random a value.
        float randomValue = UnityEngine.Random.Range(0f, weightSum);
        //Debug.Log( "randomValue: " + randomValue );
        int currentSearchCount = 0;
        foreach (var item in _randomIntervalMap) {
            currentSearchCount++;
            if (currentSearchCount == _randomIntervalMap.Count) {
                //the last interval is [closed,closed]
                if (item.Value.x <= randomValue && randomValue <= item.Value.y) {
                    return item.Key;
                }
            }
            else {
                //interval is [closed, opened)
                if (item.Value.x <= randomValue && randomValue < item.Value.y) {
                    randomResult = item.Key;
                }
            }
        }
        return randomResult;
    }

你可能感兴趣的:(c#)