Заполнение массива случайными числами с условием

Форум пользователей пакета Maple

Модератор: Admin

Mariia
Сообщения: 4
Зарегистрирован: Вт ноя 28, 2017 11:26 am

Заполнение массива случайными числами с условием

Сообщение Mariia » Вт ноя 28, 2017 11:31 am

Здравствуйте! Подскажите, пожалуйста, как в Maple создать вектор (массив), состоящий из 3 случайных чисел, причем сумма элементов вектора должна быть равна 1.
Для создания массива пользуюсь функцией random:
r := random[uniform[0, 1]](3);
0.8001874845, 0.4275520569, 0.8426226844
Но никак не могу придумать, как задать условие, чтобы сумма этих элементов была равна 1.
Заранее спасибо!

Markiyan Hirnyk
Сообщения: 1219
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Re: Заполнение массива случайными числами с условием

Сообщение Markiyan Hirnyk » Вт ноя 28, 2017 11:47 am

1. Если я правильно понимаю вопрос, то можно пронормировать полученные числа

Код: Выделить всё

restart; with(stats): r := random[uniform[0, 1]](3);
           0.3957188605, 0.1931398164, 0.02242417046
convert([r/convert([r], `+`)], Vector);
Vector[column](3, [.6473580312, .3159581808, 0.3668378813e-1])

2. Пакет устарел и снят с эксплуатации. Для генерирования случайных чисел можно применить

Код: Выделить всё

convert(RandomTools:-Generate(list(float, 3)), Vector);
Vector[column](3, [.5108327385, 0.8517118248e-1, .1791765017])

или

Код: Выделить всё

t := Statistics:-Sample(Uniform(0, 1), 3);
               t := Vector[row](3, [.655740699156587, 0.357116785741896e-1, .849129305868777])
t/convert(t, `+`);
                 Vector[row](3, [.425644875657911, 0.231806459562401e-1, .551174478385849])

3. Вектор (Vector) и массив (Array) - разные типы данных. В вашем возрасте пора это знать.

Mariia
Сообщения: 4
Зарегистрирован: Вт ноя 28, 2017 11:26 am

Re: Заполнение массива случайными числами с условием

Сообщение Mariia » Вт ноя 28, 2017 12:39 pm

Markiyan Hirnyk, большое Вам спасибо за ответ! Но ни в одном из приведенных Вами примеров сумма полученных элементов не равна единице, а это главное, потому что именно это у меня не получается... Можно как-то решить этот вопрос?

Markiyan Hirnyk писал(а):Источник цитаты 3. Вектор (Vector) и массив (Array) - разные типы данных. В вашем возрасте пора это знать.

Прошу прощения, разве вектор нельзя назвать одномерным массивом?

Mariia
Сообщения: 4
Зарегистрирован: Вт ноя 28, 2017 11:26 am

Re: Заполнение массива случайными числами с условием

Сообщение Mariia » Вт ноя 28, 2017 12:44 pm

Markiyan Hirnyk, ах да, вот увидела: вы нормируете элементы вектора, и таким образом в сумме они дают единицу. Но нельзя ли сразу задавать случайные числа так, чтобы их сумма была равна 1?

Markiyan Hirnyk
Сообщения: 1219
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Re: Заполнение массива случайными числами с условием

Сообщение Markiyan Hirnyk » Вт ноя 28, 2017 4:26 pm

Сомневаюсь, что три неотрицательные числа, сумма которых равна единице, можно считать случайными. Пожалуйста, дайте ссылку на определение. Вот другой вариант:

Код: Выделить всё

x := Statistics:-Sample(Uniform(0, 1), 1)[1];
                   HFloat(0.8147236863931789)
y := Statistics:-Sample(Uniform(0, 1-x), 1)[1];
                  HFloat(0.02766064299357842)
z := 1-x-y;
                  HFloat(0.15761567061324264)

В Математике можно выбрать случайную точку треугольника с вершинами в (1,0.0), (0,1,0), (0,0,1):

Код: Выделить всё

RandomPoint[Triangle[{{0, 0, 1}, {1, 0, 0}, {0, 1, 0}}]]
{0.470281,0.10629,0.423429}

Mariia
Сообщения: 4
Зарегистрирован: Вт ноя 28, 2017 11:26 am

Re: Заполнение массива случайными числами с условием

Сообщение Mariia » Вт ноя 28, 2017 4:58 pm

Markiyan Hirnyk,
x := Statistics:-Sample(Uniform(0, 1), 1)[1];
HFloat(0.8147236863931789)
y := Statistics:-Sample(Uniform(0, 1-x), 1)[1];
HFloat(0.02766064299357842)
z := 1-x-y;
HFloat(0.15761567061324264)

Спасибо Вам огромное, это решение отлично мне подходит! :)