Esempio n. 1
0
        //p:用于解析原随机范围
        //percentile:将下限提升至 :【下限+ (上限-下限)*percentile】 的值。 by PY 2017.7.19
        static public string GeneratePara(string p, float percentile = 0)
        {
            string v = p.Trim('\n');

            if (v.StartsWith("{") && v.EndsWith("}"))//枚举
            {
                v = v.Trim(new char[] { '{', '}' });
                return(ToolsShared.GetRandomElement(v.Split('-')));
            }
            else if (v.StartsWith("[") && v.EndsWith("]")) //整数范围
            {
                v = v.Trim(new char[] { '[', ']' });
                int min    = int.Parse(v.Split('-')[0]);
                int max    = int.Parse(v.Split('-')[1]);
                int newmin = (int)(min + (max - min) * percentile);
                if (newmin < min)
                {
                    newmin = min;
                }
                return(ToolsSharedEx.GetImbalancedRandomInt(newmin, max).ToString());
            }
            else if (v.StartsWith("(") && v.EndsWith(")")) //浮点范围
            {
                v = v.Trim(new char[] { '(', ')' });
                float min    = float.Parse(v.Split('-')[0]);
                float max    = float.Parse(v.Split('-')[1]);
                float newmin = min + (max - min) * percentile;
                return(ToolsSharedEx.GetImbalancedRandom(newmin, max).ToString("#.#"));
            }
            else
            {
                return(v);
            }
        }
Esempio n. 2
0
        public List <TriggerInstance> GenerateDifferentTriggers(List <ItemDropTip> tipPools, int count, float percentile, string tag = "")
        {
            List <ItemDropTip>     visited = new List <ItemDropTip>();
            List <TriggerInstance> rst     = new List <TriggerInstance>();

            if (tipPools.Count < count)
            {
                HSUtils.LogError("物品随机属性个数小于设定个数!模板=" + Key);
                count = tipPools.Count;
            }
            var tList = ToolsShared.GenerateRandomListNotRepeat(tipPools, count);

            for (var i = 0; i < tList.Count; i++)
            {
                var             t       = tList[i];
                TriggerInstance trigger = t.GenerateItemTrigger(percentile);
                if (trigger != null)
                {
                    trigger.Tag = tag;
                    rst.Add(trigger);
                }
            }

            return(rst);
        }
Esempio n. 3
0
        public static Item RandomGetByLevel(int level)
        {
            var itemList = ConfigTable.GetAll <Item>().Where(item => { return(item.Level > level - 3 && item.Level < level + 3); }).ToList();

            if (itemList == null || itemList.Count == 0)
            {
                return(null);
            }
            int index = ToolsShared.GetRandomInt(0, itemList.Count - 1);

            return(itemList[level]);
        }
Esempio n. 4
0
        public List <TriggerInstance> GenerateItemTriggers(double teamMf, float percentile)
        {
            List <TriggerInstance> list = new List <TriggerInstance>();

            //固定属性
            foreach (var t in GetMustTips())
            {
                var trigger = t.GenerateItemTrigger(percentile);
                if (trigger != null)
                {
                    list.Add(trigger);
                }
            }

            //随机属性
            List <double> rates           = GetRandomRates();
            bool          randomGenerated = false;

            for (int i = rates.Count - 1; i >= 0; --i)
            {
                var rate         = rates[i] * (1 + teamMf);
                int triggercount = i + 1;
                if (triggercount < RandomMin || triggercount > RandomMax)
                {
                    continue;
                }

                //匹配到了
                if (ToolsShared.ProbabilityTest(rate))
                {
                    list.AddRange(GenerateDifferentTriggers(GetRandomTips().ToList(), i + 1, percentile));
                    randomGenerated = true;
                    break;
                }
            }

            //没有匹配到
            if ((!randomGenerated) && RandomMin > 0)
            {
                list.AddRange(GenerateDifferentTriggers(GetRandomTips().ToList(), RandomMin, percentile));
            }
            return(list);
        }
Esempio n. 5
0
        //获取距离江湖元年的真实时间
        //public static DateTime GetDateSinceJianghuZeroYear()
        //{
        //    if (jianghuYearZero == DateTime.MinValue)
        //    {

        //        var jianghuYearZeroServer = ConfigManager.Get("JIANGHU_YEAR_ZERO", "");
        //        if (!string.IsNullOrEmpty(jianghuYearZeroServer))
        //        {
        //            jianghuYearZero = DateTime.ParseExact(jianghuYearZeroServer, "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture);
        //        }
        //        else
        //        {
        //            jianghuYearZero = DateTime.ParseExact(ConfigManager.Get("JIANGHU_YEAR_ZERO"), "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture);
        //        }
        //    }
        //    var date = jianghuYearZero + TimeSpan.FromDays((HSTimeHelper.Now - jianghuYearZero).TotalDays * 4);

        //    return date;
        //}
        #endregion

        //生成a到b直接不均匀分布的随机数,靠近a的部分概率大,靠近b的部分概率小
        public static double GetImbalancedRandom(double a, double b)
        {
            double tmp = 0;

            if (b < a)
            {
                tmp = a;
                a   = b;
                b   = tmp;
            }

            int rate = 4; //高概率部分爆率为低概率的1/(2 * 5 ) = 1/ 10

            double diff = b - a;
            double num  = ToolsShared.GetRandom(a, a + rate * diff);

            if (num >= a && num <= a + (rate - 1) * diff)
            {
                num = a + (num - a) / (double)((rate - 1) * 2);
            }
            else
            {
                num = num - (rate - 1) * diff;
            }

            if (num < a)
            {
                num = a;
            }

            if (num > b)
            {
                num = b;
            }

            return(num);
        }