Скажем, массив состоит из n элементов. Пусть X1, X2, ..., Xn обозначают случайные величины, где Xi представляет число раз, когда n-й элемент встречается, затем обусловлено X1 = x1, X2 = x2, ... и X (i-1) = x (i-1) Xi подчиняется биномиальному распределению с параметрами (N - x1 - x2 - ... - x (i-1)) и 1 / (n - i + 1). Таким образом, вы можете нарисовать X1, X2, ..., Xn в следующем порядке:
#include <iostream>
#include <random>
template <typename Iter, typename Int_type>
void draw(Iter begin, Iter end, Int_type N)
{
auto n = std::distance(begin, end);
static std::mt19937 gen{std::random_device{}()};
while (begin != end) {
std::binomial_distribution<Int_type> d(N, 1 / static_cast<double>(n));
auto number = d(gen);
*begin++ = number;
--n;
N -= number;
}
}
int main()
{
unsigned count[10];
draw(std::begin(count), std::end(count), 10000u);
for (auto i : count) std::cout << i << ", ";
}