генерирование определенной последовательности блоков чисел в Matlab - PullRequest
0 голосов
/ 05 июня 2018

Мне нужно сгенерировать последовательность из 8 блоков чисел.Размеры блоков могут варьироваться от 28 до 32. Я застрял в том, что сумма всех блоков должна быть определенным числом.Скажем, 243.

Я пробовал циклический блок за блоком, где размер блока генерируется случайным образом между этими значениями, но последний блок либо становится большим, либо маленьким большую часть времени.Я могу продолжать работать до тех пор, пока не получу несколько таких работ, но это не так эффективно.

Я уверен, что есть лучший способ.Спасибо за любую помощь. С наилучшими пожеланиями

1 Ответ

0 голосов
/ 05 июня 2018

Рассчитайте 8 блоков, как вы делаете в данный момент.Сумма всех этих блоков будет больше или меньше, чем желаемая сумма.

Затем сложите все блоки вместе и найдите действительную сумму.Например:

blocks = randn(8,28);
actual_sum = sum(sum(blocks));
desired_sum = 243;

Затем вы вычисляете коэффициент, на который вы должны умножить все значения, чтобы получить желаемую сумму.Например:

ratio = desired_sum/actual_sum;

Тогда вы просто умножите все свои блоки с этим соотношением, и вы достигнете своей цели.Например:

blocks = blocks * ratio;

Это приведет к значениям с десятичными знаками (или числами с плавающей запятой).Если вы хотите целые числа, просто округлите все значения и немного отрегулируйте последний блок с учетом созданной разницы.Например:

blocks = round(blocks,0);
diff = sum(sum(blocks)) - desired_sum;
blocks(1,1) = blocks(1,1) - diff;
if sum(sum(blocks))==desired_sum
    fprintf("It works!");
end

Отказ от ответственности: У меня нет Matlab, поэтому вам может потребоваться исправить некоторые имена функций или около того.Метод, стоящий за этим, должен быть твердым.

...