根据权重配置随机

    /// <summary>
    /// 不是每次都创建一个新的map,用于减少gc
    /// </summary>
    private static readonly Dictionary<object, Vector2> _randomIntervalMap = new Dictionary<object, Vector2>();
    /// <summary>
    /// 根据权重配置随机出一种结果。
    /// </summary>
    /// <param name="weightInfo"></param>
    /// <returns></returns>
    public static object RandomObjectByWeight (Dictionary<object, float> 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;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值