2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Генерация специальных случайных чисел [Mathematica]
Сообщение02.04.2018, 20:46 
Приветствую, возникла задача в системе Mathematica сгенерировать 3 случайных целых числа $a$, $b$, $c$, такие, что число $a+b+c$ делится на $100$.
Я пытался делать так:
Код:
a = RandomInteger[{-100000, 100000}];
b = RandomInteger[{-100000, 100000}];
c = 100 - a - b;

Тут в последней строке можно поставить не только 100, но и 200, 300, и т.д.

Но ясно, что это "искусственный" способ, потому что третье число зависит от первых двух.

Меня интересует, как это лучше сделать? Также, как генерировать не три числа, а в общем случае $n$ чисел, сумма которых равна $m$?

Спасибо.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение02.04.2018, 20:50 
xjar1 в сообщении #1301249 писал(а):
Но ясно, что это "искусственный" способ, потому что третье число зависит от первых двух.

Меня интересует, как это лучше сделать? Также, как генерировать не три числа, а в общем случае $n$ чисел, сумма которых равна $m$?
Последнее сформулированное Вами условие означает, что $n$-ое число действительно зависит от предыдущих $n-1$, так что так и делать: генерировать $n-1$, последнее вычислять.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение02.04.2018, 21:11 
Может быть, проблема не в зависимости, от которой действительно деться нельзя по определению, а в том, что распределение третьего числа будет отличаться от распределений первого и второго? Вот с этим можно было бы и побороться. Если проблема в этом.

-- Пн апр 02, 2018 23:20:10 --

Один из приходящих на ум способов: генерируем $n$ независимых одинаково распределённых целых, после чего смотрим на отличие $\Delta$ их суммы от интересующего числа и добавляем к каждому числу $\lfloor\Delta/ n\rfloor$. Остаётся добавить к слагаемым ещё $\Delta\bmod n$ единиц — сделаем это, равновероятно выбрав одно из сочетаний из $n$ по $\Delta$ и подобавляв единицы к тем числам, индексы которых входят в сочетание. Распределения каждого полученного числа в отдельности будут одинаковыми.

-- Пн апр 02, 2018 23:22:26 --

Конечно, распределение на выходе может чем-то не угодить, несмотря на то, что при разных исходных оно будет разным, но пока ТС не изъявляет желания иметь какое-то конкретное, тут нечего улучшать.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение02.04.2018, 21:59 
Можно и в цикле генерить три числа, проверять делится ли сумма и если нет - повторять цикл начиная с генерации новой тройки. Работать будет нереально долго, зато сохранит распределения.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение02.04.2018, 23:11 
Ой, я что-то не то написал, получается. У меня сумма выходит равна константе, а у ТС допустимо, чтобы она была равна и другим её кратным. Ну, тут явные детали вряд ли нужны, всё должно додумываться несложно — брать то кратное, которое ближе. Правда, распределение это сильно усложнит. Ну и что: пока никто ещё на это не успел пожаловаться!

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение03.04.2018, 16:47 
Аватара пользователя
Генерируем случайную тройку, нормируем значения на требуемую сумму, случайные два из трех округляем, а третье вычисляем как разность требуемой суммы и двух уже округленных.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение03.04.2018, 18:31 
Аватара пользователя
Генерируем требуюмую сумму, генерируем пропорцию, "случайно" округляем.

В общем, всё сильно зависит от того, для каких "параметров" задано (желательно) их распределение.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 15:04 
Я бы предложил такой вариант:
Код:
a = RandomInteger[{-100000, 100000}];
b = RandomInteger[{-100000, 100000}];
x = RandomInteger[{-1000+(a+b)/100, 1000+(a+b)/100}];
c = 100*x - a - b;

Диапазон для x возможно надо подправить...

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 18:43 
Аватара пользователя
artur_k в сообщении #1301596 писал(а):
Я бы предложил такой вариант:

Очевидно, это работает неправильно.
Предположим, что сгенерировалось $x = 0, y = 0, x = 0$, тогда $c = 0$ и $a + b + c \neq 100$

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 19:25 
photon в сообщении #1301617 писал(а):
Очевидно, это работает неправильно.
Предположим, что сгенерировалось $x = 0, y = 0, x = 0$, тогда $c = 0$ и $a + b + c \neq 100$

По условию задачи, сумма должна делиться на 100, а не равняться этому числу. Формально, 0 делится на 100.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 19:32 
Аватара пользователя
artur_k в сообщении #1301624 писал(а):
По условию задачи, сумма должна делиться на 100, а не равняться этому числу. Формально, 0 делится на 100.

Точно, прошу прощения, забыл уже этот момент.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 23:14 
Генерировать любые и из получившегося множества отбирать подмножество с тройками, суммы которых кратны 100.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 23:32 
Кстати, это в общем случае весьма неэффективно.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 23:42 
Построить множество из сумм троек кратным ста и случайным образом дергать оттуда эти тройки.

 
 
 
 Re: Генерация специальных случайных чисел
Сообщение05.04.2018, 09:22 
В первой строке первого поста поставлена задача сгенерировать три числа, сумма которых кратна 100.
Затем, почему-то, обсуждается как сгенерировать три числа сумма которых равна 100.

Исходную я бы решал так:
генерируем два случайных целых числа $a$ и $b$ из достаточно большого диапазона;
генереруем $x$ из в 100 раз меньшего диапазона;
полагаем $c = 100x - a - b$.

 
 
 [ Сообщений: 17 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group