Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / common / WeightRandom.cs
@小李xl 小李xl on 7 Apr 2023 2 KB 房间添加权重功能
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. /// <summary>
  6. /// 带有权重的随机值处理类
  7. /// </summary>
  8. public class WeightRandom
  9. {
  10. private (float, int)[] _prepareAdRewardWeight;
  11.  
  12. /// <summary>
  13. /// 初始化权重列表
  14. /// </summary>
  15. public void InitAdRewardWeight(int[] weightList)
  16. {
  17. var total = weightList.Sum();
  18. var length = weightList.Length;
  19. var avg = 1f * total / length;
  20. var smallAvg = new List<(float, int)>();
  21. var bigAvg = new List<(float, int)>();
  22. for (int i = 0; i < weightList.Length; i++)
  23. {
  24. (weightList[i] > avg ? bigAvg : smallAvg).Add((weightList[i], i));
  25. }
  26.  
  27. _prepareAdRewardWeight = new (float, int)[weightList.Length];
  28. for (int i = 0; i < weightList.Length; i++)
  29. {
  30. if (smallAvg.Count > 0)
  31. {
  32. if (bigAvg.Count > 0)
  33. {
  34. _prepareAdRewardWeight[smallAvg[0].Item2] = (smallAvg[0].Item1 / avg, bigAvg[0].Item2);
  35. bigAvg[0] = (bigAvg[0].Item1 - avg + smallAvg[0].Item1, bigAvg[0].Item2);
  36. if (avg - bigAvg[0].Item1 > 0.0000001f)
  37. {
  38. smallAvg.Add(bigAvg[0]);
  39. bigAvg.RemoveAt(0);
  40. }
  41. }
  42. else
  43. {
  44. _prepareAdRewardWeight[smallAvg[0].Item2] = (smallAvg[0].Item1 / avg, smallAvg[0].Item2);
  45. }
  46.  
  47. smallAvg.RemoveAt(0);
  48. }
  49. else
  50. {
  51. _prepareAdRewardWeight[bigAvg[0].Item2] = (bigAvg[0].Item1 / avg, bigAvg[0].Item2);
  52. bigAvg.RemoveAt(0);
  53. }
  54. }
  55. }
  56.  
  57. /// <summary>
  58. /// 获取下一个随机索引
  59. /// </summary>
  60. public int GetRandomIndex()
  61. {
  62. var randomNum = Utils.RandomDouble() * _prepareAdRewardWeight.Length;
  63. var intRan = (int)Math.Floor(randomNum);
  64. var p = _prepareAdRewardWeight[intRan];
  65. if (p.Item1 > randomNum - intRan)
  66. {
  67. return intRan;
  68. }
  69. else
  70. {
  71. return p.Item2;
  72. }
  73. }
  74. }