Я делаю космическую игру с планетами, которые генерируются случайным образом, и мне нужно, чтобы их атмосферы состояли из случайного количества различных элементов. Итак, дело в том, что я хочу, чтобы элементы были в процентах от полной атмосферы, например: кислород = 30, азот = 20, углекислый газ = 50, водород = 0. Все эти значения должны быть полностью рандомизированы, и сумма их всех имеет быть 100.
В основном я хочу заполнить контейнер доверху случайным количеством заданных элементов, но я не знаю, как рандомизировать все переменные и получить фиксированную сумму.
Я впервые отправляю что-либо в StackOverflow, поэтому, пожалуйста, дайте мне знать, если мне нужно что-то уточнить, я так долго застрял в этой проблеме, не найдя ответов, поэтому буду признателен за любую помощь, спасибо :)
(Я использую С# в единстве, если это имеет значение)
Ну, вы могли бы подумать об этом с другой точки зрения и сгенерировать случайные значения для каждого элемента, а затем использовать их сумму как 100%.
Например...
var rnd = New Random()
ChecmicalsInAir = 9;
Hydrogen = rnd.Next();
Oxygen = rnd.Next();
...
TotalAtmos = (Hydrogen + Oxygen + ...);
Да - как указано canton7 ниже:
Разделив химическое вещество на TotalAtmos
, вы получите процент атмосферы.
Просто чтобы добавить немного больше к этому ответу, вы также можете использовать Dictionary
для хранения информации, а не простые переменные; Таким образом, вы можете включать в атмосферу различные газы, так как не на всех планетах может быть кислород или азот, это может добавить различные бонусы или штрафы, но остается простым процессом для расчета процентов.
@ canton7 - хорошо подмечено. Я обновил свой пост, спасибо.
Вопросы вроде «как бы вы это спроектировали…» лучше подходят для разработки игр. Эти вопросы, как правило, получают здесь много отрицательных голосов.
Вот один из способов сделать это.
int elementCount = 3; // set to the number of elements you have
List<float> elementPercents = new List<float>();
// Assign an initial value between 0 and 1 to each element, and set totalWeight
// to the sum of all those values. Note that this lets you have 0 for an element.
// If you don't want 0 for an element, adjust the Random.Range
float totalWeight = 0;
for (int i = 0; i < elementCount; i++)
{
elementPercents.Add(UnityEngine.Random.Range(0f, 1f));
totalWeight += elementPercents[i];
}
// Set the percent of each element to its proportion of the total weight.
// For example, if Oxygen = 0.1 and Hydrogen = 0.2 and Nitrogen = 0.3 from the above statement,
// then Oxygen's percent = 0.1 / (0.1 + 0.2 + 0.3) = 0.167
for (int i = 0; i < elementCount; i++)
{
elementPercents[i] /= totalWeight;
}
// Assign the percents to each element according to your requirements, for example
float hydrogen = elementPercents[0];
float nitrogen = elementPercents[1];
float oxygen = elementPercents[2];
Если непонятно: вы можете получить значения от 0 до 100 для каждого из ваших элементов, разделив
Hydrogen
,Oxygen
и т. д. наTotalAtoms
, а затем* 100