Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1. //
  2. // main.cpp
  3. // director-distribute-via-weight
  4. //
  5. // 有 N 个消费者,分别有相应的权值
  6. // 随机分发消息队列中的消息
  7. // 各个消费者消费的消息数量的比值,总体近似为权值的比值
  8. //
  9. // Created by aaron67 on 15/10/13.
  10. // Copyright © 2015年 aaron67. All rights reserved.
  11. //
  12.  
  13. #include <iostream>
  14. #include <vector>
  15. #include <ctime>
  16. using namespace std;
  17.  
  18. class Consumer {
  19. public:
  20. explicit Consumer(int weight = 0) : weight_(0) {}
  21.  
  22. void set_id(char id) {
  23. id_ = id;
  24. }
  25.  
  26. void set_weight(int weight) {
  27. weight_ = weight;
  28. }
  29.  
  30. inline int weight() const {
  31. return weight_;
  32. }
  33.  
  34. inline void consume(int message_id ) {
  35. message_id_list_.push_back(message_id);
  36. }
  37.  
  38. inline size_t consumed_messages_count() const {
  39. return message_id_list_.size();
  40. }
  41.  
  42. void display_consumed_messages() const {
  43. const int MESSAGE_ID_COUNT_PER_LINE = 15;
  44. cout << id_ << ": " << message_id_list_.size();
  45. for (int i = 0; i < message_id_list_.size(); ++i) {
  46. if (i % MESSAGE_ID_COUNT_PER_LINE == 0) {
  47. cout << endl;
  48. }
  49. cout << message_id_list_[i] << ' ';
  50. }
  51. cout << endl;
  52. }
  53.  
  54. private:
  55. char id_;
  56. int weight_;
  57. vector<int> message_id_list_;
  58. };
  59.  
  60. const int TOTAL_MESSAGE_COUNT = 200;
  61. const int MAX_RAND_COUNT = 10;
  62.  
  63. void distribute(vector<Consumer> &consumers, int message_id) {
  64. int total_weight = 0;
  65. for (int i = 0; i < consumers.size(); ++i) {
  66. total_weight += consumers[i].weight();
  67. }
  68.  
  69. int rand_count = MAX_RAND_COUNT;
  70. while (rand_count--) {
  71. int index = rand() % consumers.size();
  72. if (consumers[index].consumed_messages_count() < 1.0 * TOTAL_MESSAGE_COUNT * consumers[index].weight() / total_weight ||
  73. rand_count == 0) {
  74. consumers[index].consume(message_id);
  75. break;
  76. }
  77. }
  78. }
  79.  
  80. int main(int argc, const char * argv[]) {
  81. srand((unsigned int)time(NULL));
  82.  
  83. int consumer_count;
  84. cin >> consumer_count;
  85.  
  86. vector<Consumer> consumers(consumer_count);
  87. for (int i = 0; i < consumer_count; ++i) {
  88. int weight;
  89. cin >> weight;
  90. consumers[i].set_id('A' + i);
  91. consumers[i].set_weight(weight);
  92. }
  93.  
  94. for (int i = 0; i < TOTAL_MESSAGE_COUNT; ++i) {
  95. distribute(consumers, i);
  96. }
  97.  
  98. for (int i = 0; i < consumer_count; ++i) {
  99. consumers[i].display_consumed_messages();
  100. cout << endl;
  101. }
  102.  
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement