Мне нужно сделать четыре случайных числа, сумма которых должна быть равна 100. Эти цифры должны находиться в диапазоне от 1 до 100.Как генерировать случайные числа суммируя до 100?
Как это сделать?
Мне нужно сделать четыре случайных числа, сумма которых должна быть равна 100. Эти цифры должны находиться в диапазоне от 1 до 100.Как генерировать случайные числа суммируя до 100?
Как это сделать?
Вы можете генерировать четыре случайных чисел, например, в диапазоне 0..100, то Rescale их, чтобы иметь 100 как сумма:
x_i' = 1 + x_i*96.0/sum
Это решение не обеспечивает равномерного распределения {x_i}.
@PeterWood нашел лучший ответ на этот вопрос Random numbers that add to 100: Matlab
Я не понимаю этого, объясните пожалуйста. – Alen
'double x1 = random (0, 100); double x2 = random (0, 100); double x3 = случайный (0, 100); double x4 = случайный (0, 100); double sum = x1 + x2 + x3 + x4; x1 * = 100,0/сумма; x2 * = 100.0/sum; x3 * = 100,0/сумма; x4 * = 100.0/sum; ' Примечание: это только псевдокод – kassak
правильный, но если требуются целые числа, вам необходимо убедиться, что округление происходит правильно. C++ использует слово для целочисленного деления, поэтому в плохом случае целые числа x_i 'суммируются только до 97. Рассмотрим числа [24.9, 24.9, 24.9, 25.3], так как они складываются до 100.0, но их целая сумма будет равна 24 + 24 + 24 + 25 = 97. – Piotr99
Создать первое случайное число из диапазона 1..97.
Затем генерируют второе случайное число из диапазона 1 .. (98 первых)
Затем генерирует третье случайное число из диапазона 1 .. (99- (первый + последний))
Наконец установлен последние число как 100 - (первый + второй + третий)
Я уверен, что это будет неравномерное распределение вероятности, если это что-то OP заботится. – Dukeling
Кроме того, ОП запросил диапазон, начинающийся с 1, есть ли какое-либо обоснование ограничения лимитов диапазонов вместо того, чтобы просто принимать три случайных числа во всем диапазоне? – PlasmaHH
ОП не запрашивал конкретного распределения вероятностей. Тот факт, что цифры должны суммироваться до 100, является основной причиной неравномерного распределения, потому что одно большое число всегда будет производить еще три небольших. – Spook
Если целое число в диапазоне [1100] (с obviusly распада в [1,97]) является то, что вам нужно:
double x1 = random(0, 1);
double x2 = random(0, 1);
double x3 = random(0, 1);
double x4 = random(0, 1);
double sum = x1+x2+x3+x4;
int n1 = 1 + x1*96.0/sum;
int n2 = 1 + x2*96.0/sum;
int n3 = 1 + x3*96.0/sum;
int n4 = 100 - n1 - n2 -n3;
В чем проблема? – qPCR4vir
Хорошо ... Я писал ... удаление – qPCR4vir
@ Dukeling Это довольно распространено в SO, потому что мало кто может написать похожие ответы в одно и то же время, я не вижу причин, дающих этому возможность. Downvotes - для ответов низкого качества, и это прекрасно отвечает на вопрос. – Spook
Ничто в в описании проблемы говорится, что каждое число должно быть в диапазоне от 1 до 100. Вы можете просто изменить мод с каждым проходом. Что-то вроде:
int sum = 0;
std::vector<int> randomNums();
while (sum != 100) {
const int randomNum = std::rand() % (99 - sum);
sum += randomNum
randomNums.push_back(randomNum);
}
Создайте три случайных числа и возьмите четвертый, чтобы быть 100 - суммой. –
Как насчет генерации 3 чисел и вычисления последнего как 100 - сумма этих трех? – LihO
Создайте только три. – PlasmaHH