на JS, переделать в C# нетрудно
function randomSets(boxSizes, z) {
const arr = [];
const result = [];
for (let i = 0; i < boxSizes.length; ++i) {
result.push([]);
const y = boxSizes[i];
for (let j = 0; j < y; ++j) {
arr.push(i);
}
}
let len = arr.length;
for (let i = 0; i < z && len > 0; ++i) {
const pos = Math.floor(Math.random() * len);
result[arr[pos]].push(i);
arr[pos] = arr[--len];
}
return result;
}
const fill = randomSets([1, 2, 2], 5); // в качестве блоков - номера от 0 до z-1
пример результата:
[
[1], // содержимое 0 стопки
[0, 4], // содержимое 1 стопки
[2, 3] // содержимое 2 стопки
]