Первое, что я должен сказать, это то, что, вероятно, есть имя для такого рода проблем, я просто не знаю его имени.Программирование случайного распределения с различными весами
Объяснение:
Существует 8 слотов шарика и 100 шаров, чтобы быть случайным образом распределены между слотами. Существует 3 разных типа слотов: красный, зеленый и синий. Красный слот должен иметь не менее 6 мячей, зеленый 15 и синий не имеет значения.
Помимо необходимого количества для каждого цвета, есть возможность иметь несколько красных, зеленых или синих слотов, каждый из которых имеет ту же скорость шаров, которые будут входить в них. Красный - 4%, зеленый - 15%, а синий - это остальное, что не было выбрано.
Так случайно указывает последовательность это возможность:
Slot 1 - Blue with 17 balls
Slot 2 - Green with 8 balls
Slot 3 - Green with 12 balls
Slot 4 - Red with 1 ball
Slot 5 - Blue with 33 balls
Slot 6 - Red with 7 balls
Slot 7 - Blue with 12 balls
Slot 8 - Green with 10 balls
Обратите внимание, что требуемые суммы были заполнены, а также есть больше чем один красный и зеленый слоты, хотя его нужно только один (с в по крайней мере, общее количество шариков внутри).
Что мне нужно - это псевдокод или код на любом языке, показывающий, как распределить все 100 шаров между разными слотами и с разными весами. Я программировал его, но каждые 3 прогона, один не может раздавать каждый мяч, он пропускает некоторые.
--edit: Эскиз кода, который я сделал в C# (это только поколение цветных слотов):
int amountOfRedSlots = 0, amountOfGreenSlots = 0, amountOfBlueSlots = 0;
int[] slotColors = new int[8]; //1 - red, 2 - green, 3 - blue;
for(int i = 0; i < 8; i++)
{
int num = Random.Range(1, 101);
if (num <= 4) //Spawn a redSlot
{
amountOfRedSlots++;
slotColors[i] = 1;
}
else if (num <= 19) //4 numbers excluded from not being a redSlot and 15 as percentage to be green
{
amountOfGreenSlots++;
slotColors[i] = 2;
}
else
{
amountOfBlueSlots++;
slotColors[i] = 3;
}
}
if (amountOfRedSlots < 1)
{
int rand = Random.Range(1, 9); //Choose a random slot to be red
if (slotColors[rand] == 2)
{
amountOfGreenSlots--;
} else amountOfBlueSlots--;
slotColors[rand] = 1;
amountOfRedSlots++;
}
if (amountOfGreenSlots < 1)
{
int rand;
do
{
rand = Random.Range(1, 9);
} while (slotColors[rand] == 1); //Choose a random slot to be green, but it can't be a former red slot
amountOfBlueSlots--; //Since there isn't a greenSlot, and we made sure it wasn't red, its certainly a former blue slot
slotColors[rand] = 2;
amountOfGreenSlots++;
}
//Now its needed to distribute the balls between the slots, giving the required minimum amount to be inside red slots and green slots
//Also note that there is smaller chance of a ball going inside a red/green slot (4% and 15%)
Можете ли вы показать код, который вы в настоящее время пытаетесь? Переполнение стека не является кодовым письмом. – Kupiakos
Я действительно понимаю ваше утверждение, я сказал о необходимости кода, но то, что мне действительно нужно, - это просто руководство к решению, возможно, некоторые шаги. Код, который я сделал, имеет более 200 строк, очень ununoptimized. –
Я не понимаю требования к красным и зеленым слотам. Должен быть один красный слот, поэтому вероятность того, что слот будет красным, должен составлять не менее 12,5%, что значительно превышает 4%. – rici