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
11764
Россия, Москва
Можно и в цикле генерить три числа, проверять делится ли сумма и если нет - повторять цикл начиная с генерации новой тройки. Работать будет нереально долго, зато сохранит распределения.

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


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

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


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

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


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

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

 Профиль  
                  
 
 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
12063
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
12063
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
4062
Волгоград
В первой строке первого поста поставлена задача сгенерировать три числа, сумма которых кратна 100.
Затем, почему-то, обсуждается как сгенерировать три числа сумма которых равна 100.

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

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

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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