#include <iostream>
#include <vector>
#include <random> //For std::mt19937, std::random_device(), and std::uniform_int_distribution()
#include <algorithm> //For std::shuffle
void FillBuckets(std::vector<int> &buckets, const int amountToDistribute)
{
std::mt19937 randomGenerator(std::random_device{}());
//We generate some indices to fill the bucket elements in a random order.
std::vector<size_t> bucketIndices(buckets.size());
std::iota(begin(bucketIndices), end(bucketIndices), 0);
std::shuffle(begin(bucketIndices), end(bucketIndices), randomGenerator);
int bucketsRemaining = static_cast<int>(bucketIndices.size());
int amountRemaining = amountToDistribute;
for(size_t index : bucketIndices)
{
int amountToGive = 0;
//If this isn't the last bucket, take a random amount of the remaining value.
if(bucketsRemaining > 1)
{
//Balances out the numbers a bit more, so the first few buckets don't steal everything.
//This means, if there are two buckets remaining, one of the buckets can take 100%.
//If there are three buckets remaining, the most each bucket can take is 50%.
//If there are four buckets remaining, the most each bucket can take is 33%, and so on.
int maxToGive = (amountRemaining / (bucketsRemaining-1));
amountToGive = std::uniform_int_distribution<int>(0, maxToGive)(randomGenerator);
}
//If this IS the last bucket, just take everything that remains.
else
{
amountToGive = amountRemaining;
}
buckets[index] = amountToGive;
amountRemaining -= amountToGive;
bucketsRemaining--;
}
}
int main()
{
std::vector<int> buckets(10);
FillBuckets(buckets, 100);
std::cout << "Result: ";
for(int amount : buckets)
{
std::cout << amount << " ";
}
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cmFuZG9tPiAvL0ZvciBzdGQ6Om10MTk5MzcsIHN0ZDo6cmFuZG9tX2RldmljZSgpLCBhbmQgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb24oKQojaW5jbHVkZSA8YWxnb3JpdGhtPiAvL0ZvciBzdGQ6OnNodWZmbGUKCnZvaWQgRmlsbEJ1Y2tldHMoc3RkOjp2ZWN0b3I8aW50PiAmYnVja2V0cywgY29uc3QgaW50IGFtb3VudFRvRGlzdHJpYnV0ZSkKewoJc3RkOjptdDE5OTM3IHJhbmRvbUdlbmVyYXRvcihzdGQ6OnJhbmRvbV9kZXZpY2V7fSgpKTsKCQoJLy9XZSBnZW5lcmF0ZSBzb21lIGluZGljZXMgdG8gZmlsbCB0aGUgYnVja2V0IGVsZW1lbnRzIGluIGEgcmFuZG9tIG9yZGVyLgoJc3RkOjp2ZWN0b3I8c2l6ZV90PiBidWNrZXRJbmRpY2VzKGJ1Y2tldHMuc2l6ZSgpKTsKCXN0ZDo6aW90YShiZWdpbihidWNrZXRJbmRpY2VzKSwgZW5kKGJ1Y2tldEluZGljZXMpLCAwKTsKCXN0ZDo6c2h1ZmZsZShiZWdpbihidWNrZXRJbmRpY2VzKSwgZW5kKGJ1Y2tldEluZGljZXMpLCByYW5kb21HZW5lcmF0b3IpOwoJCglpbnQgYnVja2V0c1JlbWFpbmluZyA9IHN0YXRpY19jYXN0PGludD4oYnVja2V0SW5kaWNlcy5zaXplKCkpOwoJaW50IGFtb3VudFJlbWFpbmluZyA9IGFtb3VudFRvRGlzdHJpYnV0ZTsKCQoJZm9yKHNpemVfdCBpbmRleCA6IGJ1Y2tldEluZGljZXMpCgl7CgkJaW50IGFtb3VudFRvR2l2ZSA9IDA7CgkJCgkJLy9JZiB0aGlzIGlzbid0IHRoZSBsYXN0IGJ1Y2tldCwgdGFrZSBhIHJhbmRvbSBhbW91bnQgb2YgdGhlIHJlbWFpbmluZyB2YWx1ZS4KCQlpZihidWNrZXRzUmVtYWluaW5nID4gMSkKCQl7CgkJCS8vQmFsYW5jZXMgb3V0IHRoZSBudW1iZXJzIGEgYml0IG1vcmUsIHNvIHRoZSBmaXJzdCBmZXcgYnVja2V0cyBkb24ndCBzdGVhbCBldmVyeXRoaW5nLgoJCQkvL1RoaXMgbWVhbnMsIGlmIHRoZXJlIGFyZSB0d28gYnVja2V0cyByZW1haW5pbmcsIG9uZSBvZiB0aGUgYnVja2V0cyBjYW4gdGFrZSAxMDAlLgoJCQkvL0lmIHRoZXJlIGFyZSB0aHJlZSBidWNrZXRzIHJlbWFpbmluZywgdGhlIG1vc3QgZWFjaCBidWNrZXQgY2FuIHRha2UgaXMgNTAlLgoJCQkvL0lmIHRoZXJlIGFyZSBmb3VyIGJ1Y2tldHMgcmVtYWluaW5nLCB0aGUgbW9zdCBlYWNoIGJ1Y2tldCBjYW4gdGFrZSBpcyAzMyUsIGFuZCBzbyBvbi4KCQkJaW50IG1heFRvR2l2ZSA9IChhbW91bnRSZW1haW5pbmcgLyAoYnVja2V0c1JlbWFpbmluZy0xKSk7CgkJCWFtb3VudFRvR2l2ZSA9IHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4oMCwgbWF4VG9HaXZlKShyYW5kb21HZW5lcmF0b3IpOwoJCX0KCQkvL0lmIHRoaXMgSVMgdGhlIGxhc3QgYnVja2V0LCBqdXN0IHRha2UgZXZlcnl0aGluZyB0aGF0IHJlbWFpbnMuCgkJZWxzZQoJCXsKCQkJYW1vdW50VG9HaXZlID0gYW1vdW50UmVtYWluaW5nOwoJCX0KCQkKCQlidWNrZXRzW2luZGV4XSA9IGFtb3VudFRvR2l2ZTsKCQlhbW91bnRSZW1haW5pbmcgLT0gYW1vdW50VG9HaXZlOwoJCQoJCWJ1Y2tldHNSZW1haW5pbmctLTsKCX0KfQoKaW50IG1haW4oKQp7CglzdGQ6OnZlY3RvcjxpbnQ+IGJ1Y2tldHMoMTApOwoJRmlsbEJ1Y2tldHMoYnVja2V0cywgMTAwKTsKCQoJc3RkOjpjb3V0IDw8ICJSZXN1bHQ6ICI7Cglmb3IoaW50IGFtb3VudCA6IGJ1Y2tldHMpCgl7CgkJc3RkOjpjb3V0IDw8IGFtb3VudCA8PCAiICI7Cgl9CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJCglyZXR1cm4gMDsKfQ==