2013-02-26 2 views
1

Мне нужно сделать четыре случайных числа, сумма которых должна быть равна 100. Эти цифры должны находиться в диапазоне от 1 до 100.Как генерировать случайные числа суммируя до 100?

Как это сделать?

+3

Создайте три случайных числа и возьмите четвертый, чтобы быть 100 - суммой. –

+0

Как насчет генерации 3 чисел и вычисления последнего как 100 - сумма этих трех? – LihO

+0

Создайте только три. – PlasmaHH

ответ

5

Вы можете генерировать четыре случайных чисел, например, в диапазоне 0..100, то Rescale их, чтобы иметь 100 как сумма:

x_i' = 1 + x_i*96.0/sum

Это решение не обеспечивает равномерного распределения {x_i}.

@PeterWood нашел лучший ответ на этот вопрос Random numbers that add to 100: Matlab

+0

Я не понимаю этого, объясните пожалуйста. – Alen

+0

'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

+0

правильный, но если требуются целые числа, вам необходимо убедиться, что округление происходит правильно. C++ использует слово для целочисленного деления, поэтому в плохом случае целые числа x_i 'суммируются только до 97. Рассмотрим числа [24.9, 24.9, 24.9, 25.3], так как они складываются до 100.0, но их целая сумма будет равна 24 + 24 + 24 + 25 = 97. – Piotr99

2

Создайте первое от 1 до 100-3, второе между 1 и 100-первым-2, третье - между 1 и 100 (первое + второе) -1 и четвертое = 100- (первая + вторая + третья).

+0

Вы не хотите генерировать четвертый. –

+0

@ Джеймс Канзе: Действительно! – Kamouth

+0

Downvote? Hmmm – Kamouth

3

Создать первое случайное число из диапазона 1..97.

Затем генерируют второе случайное число из диапазона 1 .. (98 первых)

Затем генерирует третье случайное число из диапазона 1 .. (99- (первый + последний))

Наконец установлен последние число как 100 - (первый + второй + третий)

+1

Я уверен, что это будет неравномерное распределение вероятности, если это что-то OP заботится. – Dukeling

+0

Кроме того, ОП запросил диапазон, начинающийся с 1, есть ли какое-либо обоснование ограничения лимитов диапазонов вместо того, чтобы просто принимать три случайных числа во всем диапазоне? – PlasmaHH

+0

ОП не запрашивал конкретного распределения вероятностей. Тот факт, что цифры должны суммироваться до 100, является основной причиной неравномерного распределения, потому что одно большое число всегда будет производить еще три небольших. – Spook

3

Если целое число в диапазоне [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; 
+0

В чем проблема? – qPCR4vir

+1

Хорошо ... Я писал ... удаление – qPCR4vir

+1

@ Dukeling Это довольно распространено в SO, потому что мало кто может написать похожие ответы в одно и то же время, я не вижу причин, дающих этому возможность. Downvotes - для ответов низкого качества, и это прекрасно отвечает на вопрос. – Spook

0

Ничто в в описании проблемы говорится, что каждое число должно быть в диапазоне от 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); 
} 
Смежные вопросы