//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); } }
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); }
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]); }
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); }
//获取距离江湖元年的真实时间 //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); }