2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Генерация специальных случайных чисел [Mathematica]
Сообщение02.04.2018, 20:46 


02/12/16
60
Приветствую, возникла задача в системе 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 
Заслуженный участник


09/05/12
25179
xjar1 в сообщении #1301249 писал(а):
Но ясно, что это "искусственный" способ, потому что третье число зависит от первых двух.

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

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение02.04.2018, 21:11 
Заслуженный участник


27/04/09
28128
Может быть, проблема не в зависимости, от которой действительно деться нельзя по определению, а в том, что распределение третьего числа будет отличаться от распределений первого и второго? Вот с этим можно было бы и побороться. Если проблема в этом.

-- Пн апр 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 
Заслуженный участник


20/08/14
11181
Россия, Москва
Можно и в цикле генерить три числа, проверять делится ли сумма и если нет - повторять цикл начиная с генерации новой тройки. Работать будет нереально долго, зато сохранит распределения.

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение02.04.2018, 23:11 
Заслуженный участник


27/04/09
28128
Ой, я что-то не то написал, получается. У меня сумма выходит равна константе, а у ТС допустимо, чтобы она была равна и другим её кратным. Ну, тут явные детали вряд ли нужны, всё должно додумываться несложно — брать то кратное, которое ближе. Правда, распределение это сильно усложнит. Ну и что: пока никто ещё на это не успел пожаловаться!

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


23/12/05
12048
Генерируем случайную тройку, нормируем значения на требуемую сумму, случайные два из трех округляем, а третье вычисляем как разность требуемой суммы и двух уже округленных.

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение03.04.2018, 18:31 
Заслуженный участник
Аватара пользователя


01/09/13
4321
Генерируем требуюмую сумму, генерируем пропорцию, "случайно" округляем.

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

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 15:04 


08/11/12
140
Донецк
Я бы предложил такой вариант:
Код:
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 
Экс-модератор
Аватара пользователя


23/12/05
12048
artur_k в сообщении #1301596 писал(а):
Я бы предложил такой вариант:

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

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 19:25 


08/11/12
140
Донецк
photon в сообщении #1301617 писал(а):
Очевидно, это работает неправильно.
Предположим, что сгенерировалось $x = 0, y = 0, x = 0$, тогда $c = 0$ и $a + b + c \neq 100$

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

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 19:32 
Экс-модератор
Аватара пользователя


23/12/05
12048
artur_k в сообщении #1301624 писал(а):
По условию задачи, сумма должна делиться на 100, а не равняться этому числу. Формально, 0 делится на 100.

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

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 23:14 


07/08/14
4231
Генерировать любые и из получившегося множества отбирать подмножество с тройками, суммы которых кратны 100.

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 23:32 
Заслуженный участник


27/04/09
28128
Кстати, это в общем случае весьма неэффективно.

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение04.04.2018, 23:42 


07/08/14
4231
Построить множество из сумм троек кратным ста и случайным образом дергать оттуда эти тройки.

 Профиль  
                  
 
 Re: Генерация специальных случайных чисел
Сообщение05.04.2018, 09:22 
Заслуженный участник


27/06/08
4058
Волгоград
В первой строке первого поста поставлена задача сгенерировать три числа, сумма которых кратна 100.
Затем, почему-то, обсуждается как сгенерировать три числа сумма которых равна 100.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: wrest


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group