Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // director-distribute-via-weight
- //
- // 有 N 个消费者,分别有相应的权值
- // 随机分发消息队列中的消息
- // 各个消费者消费的消息数量的比值,总体近似为权值的比值
- //
- // Created by aaron67 on 15/10/13.
- // Copyright © 2015年 aaron67. All rights reserved.
- //
- #include <iostream>
- #include <vector>
- #include <ctime>
- using namespace std;
- class Consumer {
- public:
- explicit Consumer(int weight = 0) : weight_(0) {}
- void set_id(char id) {
- id_ = id;
- }
- void set_weight(int weight) {
- weight_ = weight;
- }
- inline int weight() const {
- return weight_;
- }
- inline void consume(int message_id ) {
- message_id_list_.push_back(message_id);
- }
- inline size_t consumed_messages_count() const {
- return message_id_list_.size();
- }
- void display_consumed_messages() const {
- const int MESSAGE_ID_COUNT_PER_LINE = 15;
- cout << id_ << ": " << message_id_list_.size();
- for (int i = 0; i < message_id_list_.size(); ++i) {
- if (i % MESSAGE_ID_COUNT_PER_LINE == 0) {
- cout << endl;
- }
- cout << message_id_list_[i] << ' ';
- }
- cout << endl;
- }
- private:
- char id_;
- int weight_;
- vector<int> message_id_list_;
- };
- const int TOTAL_MESSAGE_COUNT = 200;
- const int MAX_RAND_COUNT = 10;
- void distribute(vector<Consumer> &consumers, int message_id) {
- int total_weight = 0;
- for (int i = 0; i < consumers.size(); ++i) {
- total_weight += consumers[i].weight();
- }
- int rand_count = MAX_RAND_COUNT;
- while (rand_count--) {
- int index = rand() % consumers.size();
- if (consumers[index].consumed_messages_count() < 1.0 * TOTAL_MESSAGE_COUNT * consumers[index].weight() / total_weight ||
- rand_count == 0) {
- consumers[index].consume(message_id);
- break;
- }
- }
- }
- int main(int argc, const char * argv[]) {
- srand((unsigned int)time(NULL));
- int consumer_count;
- cin >> consumer_count;
- vector<Consumer> consumers(consumer_count);
- for (int i = 0; i < consumer_count; ++i) {
- int weight;
- cin >> weight;
- consumers[i].set_id('A' + i);
- consumers[i].set_weight(weight);
- }
- for (int i = 0; i < TOTAL_MESSAGE_COUNT; ++i) {
- distribute(consumers, i);
- }
- for (int i = 0; i < consumer_count; ++i) {
- consumers[i].display_consumed_messages();
- cout << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement