经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
根据给定的一个概率数组随机分配概率
来源:cnblogs  作者:人间百媚千红  时间:2018/11/3 12:14:20  对本文有异议

  在程序中有时候需要为一组数据根据自定义的概率数组随机分配,如图:

概率数组:

平均分配的效果图:

 

  JS 例子:

  1. 1 function gailv(num) {
  2. 2
  3. 3
  4. 4 $(".slider_num").text(0);
  5. 5 $(".slider_num_input").val(0);
  6. 6
  7. 7 var gls = [0, 0, 0, 0, 0, 0, 0, 0.02, 0.03, 0.04, 0.04, 0.04, 0.04, 0.07, 0.09, 0.10, 0.09, 0.06, 0.08, 0.10, 0.09, 0.06, 0.02, 0.01], //概率
  8. 8 sliders = [],
  9. 9 multi = 0,
  10. 10 remainder = 0,
  11. 11 takeRemainder = 0,
  12. 12 slis = null,
  13. 13 lineSize = 200, //单行最大任务数
  14. 14 nTaskNum = lineSize * 17,
  15. 15 lineTote = lineSize * gls.length; //任务总数
  16. 16
  17. 17
  18. 18 if (num > lineTote) {
  19. 19 layer.alert('任务总数最大为' + lineTote);
  20. 20 num = lineTote;
  21. 21 }
  22. 22
  23. 23 //获取与dom相对应的数组
  24. 24 for (var a = 0; a < gls.length; a++) {
  25. 25 sliders.push(0);
  26. 26 }
  27. 27
  28. 28 //随机分配任务
  29. 29 for (var i = num; i > 0; i--) {
  30. 30
  31. 31 slis = random(sliders, gls);
  32. 32
  33. 33 if (sliders[slis] >= lineSize) {
  34. 34 for (var j = 7; j < sliders.length ; j++) {
  35. 35 if (sliders[j] < lineSize) {
  36. 36 sliders[j]++;
  37. 37 break;
  38. 38 }
  39. 39 }
  40. 40 sliders[slis] = lineSize;
  41. 41 }
  42. 42 else {
  43. 43 sliders[slis] += 1
  44. 44 }
  45. 45
  46. 46 }
  47. 47
  48. 48 //获取多余任务数
  49. 49 if (num > nTaskNum) {
  50. 50 multi = num - nTaskNum;
  51. 51 }
  52. 52
  53. 53 //分配多余任务数
  54. 54 if (multi > 0) {
  55. 55 remainder = parseInt(multi / 7);
  56. 56 takeRemainder = multi % 7;
  57. 57
  58. 58 $.each(sliders, function (index, item) {
  59. 59 if (index <= 6) {
  60. 60 sliders[index] = remainder;
  61. 61 }
  62. 62 })
  63. 63 if (takeRemainder > 0) {
  64. 64 for (var l = 0; l < takeRemainder; l++){
  65. 65 sliders[l]++;
  66. 66 }
  67. 67 }
  68. 68 }
  69. 69
  70. 70 //渲染dom
  71. 71 for (var n = 0; n < sliders.length; n++) {
  72. 72 $("#eq .slider_con").eq(n).find(".slider_num").text(sliders[n]);
  73. 73 }
  74. 74
  75. 75 $.each(sliders, function (index, item) {
  76. 76 try {
  77. 77 $("#eq .slider_con").eq(index).find(".slider_num_input").val(item);
  78. 78 $("#eq .slider_con").eq(index).find("span").slider("value", item);
  79. 79 } catch (e) {
  80. 80 }
  81. 81 });
  82. 82 }
  83. 83
  84. 84 function random(arr1, arr2) {
  85. 85 var sum = 0,
  86. 86 factor = 0,
  87. 87 random = Math.random();
  88. 88
  89. 89 for (var i = arr2.length - 1; i >= 0; i--) {
  90. 90 sum += arr2[i]; // 统计概率总和
  91. 91 };
  92. 92
  93. 93 random *= sum; // 生成概率随机数
  94. 94
  95. 95 for (var i = arr2.length - 1; i >= 0; i--) {
  96. 96 factor += arr2[i];
  97. 97 if (random <= factor)
  98. 98 return i;
  99. 99 };
  100. 100 return null;
  101. 101 };
View Code

 

   C# 例子:

  1. 1 #region 按照给定的nums总数,根据概率数组分配
  2. 2 /// <summary>
  3. 3 /// 按照给定的nums总数,根据概率数组分配
  4. 4 /// </summary>
  5. 5 /// <param name="nums">总数</param>
  6. 6 /// <param name="gls">概率数组</param>
  7. 7 /// <returns>分配好的int[]</returns>
  8. 8 public static int[] AgeProbability(int nums, double[] gls = null)
  9. 9 {
  10. 10 double[] gls1 = { 0, 0, 0, 0, 0, 0, 0.02, 0.03, 0.04, 0.04, 0.04, 0.04, 0.07, 0.09, 0.10, 0.09, 0.06, 0.08, 0.10, 0.09, 0.06, 0.02, 0.01, 0 };
  11. 11 if (gls == null)
  12. 12 gls = gls1;
  13. 13
  14. 14 int[] sliders = new int[gls.Length];
  15. 15 for (int i = 0; i < sliders.Length; i++)
  16. 16 {
  17. 17 sliders[i] = 0;
  18. 18 }
  19. 19 Random ran = new Random();
  20. 20 for (int i = nums; i > 0; i--)
  21. 21 {
  22. 22 var slis = rans(sliders, gls, ran);
  23. 23 sliders[slis] += 1;
  24. 24 }
  25. 25 return sliders;
  26. 26 }
  27. 27
  28. 28 private static int rans(int[] sliders, double[] gls, Random ran)
  29. 29 {
  30. 30 double sum = 0;
  31. 31 double actor = 0;
  32. 32 double r = ran.NextDouble();
  33. 33
  34. 34 for (int i = gls.Length - 1; i >= 0; i--)
  35. 35 {
  36. 36 sum += gls[i]; //统计概率总和
  37. 37 }
  38. 38 r *= sum; // 生成概率随机数
  39. 39 for (int i = gls.Length - 1; i >= 0; i--)
  40. 40 {
  41. 41 actor += gls[i];
  42. 42 if (r <= actor)
  43. 43 return i;
  44. 44 }
  45. 45 return 0;
  46. 46 }
  47. 47
  48. 48
  49. 49 #endregion
View Code

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号