#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cmath>
#include <array>
#include <iterator>
int main(int, char*[]){
using namespace std;
srand(time(0));
// setup bins
int total = 3;
const int MAX_BINS = 10;
array<int,MAX_BINS> bins;
// determine weighted distribution
array<float,MAX_BINS> weights;
generate(weights.begin(), weights.end(), [](){
return rand()*1.f/RAND_MAX;
});
float weight_sum = accumulate(weights.begin(), weights.end(), 0.f);
// determine portions
// use "extra" to accumulate fractional
float extra = 0;
int used = 0;
for ( int idx = 0; idx < MAX_BINS; ++idx ) {
float actual = weights[idx]/weight_sum * total + extra;
int count = (int)actual;
extra = fmodf(actual, 1.f);
bins[idx] = count;
used += count;
}
// any accumulation error is added to the first bin
int error = error;
bins[0] += total - used;
// output results
cout << "total:\t" << total
<< "\nbins:\t";
copy(bins.begin(), bins.end(), ostream_iterator<int>(cout, "\t"));
cout << "\nerror:" << error
<< "\nextra:" << total - accumulate(bins.begin(),bins.end(),0) << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxhcnJheT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKCmludCBtYWluKGludCwgY2hhcipbXSl7Cgl1c2luZyBuYW1lc3BhY2Ugc3RkOwoJc3JhbmQodGltZSgwKSk7CgoJLy8gc2V0dXAgYmlucwoJaW50IHRvdGFsID0gMzsKCWNvbnN0IGludCBNQVhfQklOUyA9IDEwOwoJYXJyYXk8aW50LE1BWF9CSU5TPiBiaW5zOwoKCS8vIGRldGVybWluZSB3ZWlnaHRlZCBkaXN0cmlidXRpb24KCWFycmF5PGZsb2F0LE1BWF9CSU5TPiB3ZWlnaHRzOwoJZ2VuZXJhdGUod2VpZ2h0cy5iZWdpbigpLCB3ZWlnaHRzLmVuZCgpLCBbXSgpewoJCXJldHVybiByYW5kKCkqMS5mL1JBTkRfTUFYOwoJfSk7CglmbG9hdCB3ZWlnaHRfc3VtID0gYWNjdW11bGF0ZSh3ZWlnaHRzLmJlZ2luKCksIHdlaWdodHMuZW5kKCksIDAuZik7CgoJLy8gZGV0ZXJtaW5lIHBvcnRpb25zCgkvLyB1c2UgImV4dHJhIiB0byBhY2N1bXVsYXRlIGZyYWN0aW9uYWwgCglmbG9hdCBleHRyYSA9IDA7CglpbnQgdXNlZCA9IDA7Cglmb3IgKCBpbnQgaWR4ID0gMDsgaWR4IDwgTUFYX0JJTlM7ICsraWR4ICkgewoJCWZsb2F0IGFjdHVhbCA9IHdlaWdodHNbaWR4XS93ZWlnaHRfc3VtICogdG90YWwgKyBleHRyYTsKCQlpbnQgY291bnQgPSAoaW50KWFjdHVhbDsKCgkJZXh0cmEgPSBmbW9kZihhY3R1YWwsIDEuZik7CgkJYmluc1tpZHhdID0gY291bnQ7CgkJdXNlZCArPSBjb3VudDsKCX0KCgkvLyBhbnkgYWNjdW11bGF0aW9uIGVycm9yIGlzIGFkZGVkIHRvIHRoZSBmaXJzdCBiaW4KCWludCBlcnJvciA9IGVycm9yOwoJYmluc1swXSArPSB0b3RhbCAtIHVzZWQ7CgoJLy8gb3V0cHV0IHJlc3VsdHMKCWNvdXQgPDwgInRvdGFsOlx0IiA8PCB0b3RhbAoJCTw8ICJcbmJpbnM6XHQiOwoKCWNvcHkoYmlucy5iZWdpbigpLCBiaW5zLmVuZCgpLCBvc3RyZWFtX2l0ZXJhdG9yPGludD4oY291dCwgIlx0IikpOwoJY291dCA8PCAiXG5lcnJvcjoiIDw8IGVycm9yCgkJPDwgIlxuZXh0cmE6IiA8PCB0b3RhbCAtIGFjY3VtdWxhdGUoYmlucy5iZWdpbigpLGJpbnMuZW5kKCksMCkgPDwgJ1xuJzsKfQ==