MATLAB генерирует случайное целое число со случайной цифрой в массиве

Первый вопрос: я пытаюсь сгенерировать случайные целые числа со случайными цифрами в массив. Однако, поскольку граничное значение целого числа варьируется как «int8», «int16», «int32», «int64» и их версии без знака, я не могу решить, какой тип следует использовать для создания моего простого массива, как показано ниже. См.: https://www.mathworks.com/help/matlab/ref/intmax.html

Когда я использую randi(n, row, column), где n — целочисленное значение верхней границы, row — номер строки, а column — номер столбца. Однако это не удовлетворяет моей цели решения моей проблемы. Итак, какую форму функции «ранд» мне следует использовать?

A= [2 7 43 556 32 35 3 4566]

Второй вопрос: если я смогу достичь своей цели в первом вопросе, как мне выполнить итерацию по каждому числу в массиве? Я хочу проверить каждую цифру числа за цифрой и соответственно. Как и в примере массива, он должен сначала проверить 2, и 7, и 4, и 3, и 5, и так далее.

Любая помощь будет оценена по достоинству.


person ozge    schedule 03.11.2017    source источник
comment
Случайные целые числа и случайные цифры для меня синонимы, но, возможно, в вашем приложении они означают что-то другое. Не могли бы вы объяснить, что именно вы пытаетесь сделать? У вас возникли трудности с выбором целочисленного типа из-за ограничений целочисленных значений? Каковы ограничения в вашем случае? Почему указание верхней границы, строки и столбца не удовлетворяет вашей цели? Какова ваша цель и желаемый результат?   -  person beaker    schedule 03.11.2017
comment
@beaker Я хотел бы сгенерировать массив, как показано в примере. Количество цифр может быть 2,3,4 и более. Итак, я возьму пользовательский ввод, который определит длину массива. Используя этот ввод, я буду определять номер столбца массива, а номер строки всегда будет равен 1.   -  person ozge    schedule 03.11.2017
comment
Итак, вам нужны случайные целые числа, каждое со случайным количеством цифр? Каков диапазон количества цифр, которые вы хотите? Могут ли целые числа быть отрицательными?   -  person beaker    schedule 03.11.2017
comment
Числа могут быть 0 или положительными целыми числами.   -  person ozge    schedule 03.11.2017
comment
Это на самом деле работает, но поскольку я не мог решить, использовать ли мне uint8 или int32, я был в замешательстве. Я исправил это прямо сейчас. Благодарю вас! Также мне интересно, почему этот вопрос получил -1?   -  person ozge    schedule 03.11.2017


Ответы (1)


Чтобы сгенерировать случайные числа в полном диапазоне заданного типа данных, вы можете использовать следующее:

n = int32(0);
type = class(n); % or you can specify it explicitly e.g. 'uint8' directly
randSize = [10 1];
randomArray = randi([intmin(type) intmax(type)],randSize,type);

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

for i = abs(randomArray(:))'
    numberOfDigits = ceil(log(double(abs(i)+1))/log(10)); % use log 10 to count digits
    fprintf('\nisolating every digit for number %i: ',i);
    for digitId = numberOfDigits:-1:1
        digitFactor = 10^(digitId-1);
        digitBeforeDivision = (i - mod(i,digitFactor));
        digit = digitBeforeDivision / digitFactor;
        fprintf('%d ',digit);
        i = i - digitBeforeDivision;
    end
end
person Jean B.    schedule 03.11.2017
comment
Для меня это был очень продвинутый подход, но он сработал. Как вы пришли к этому решению? Не могли бы вы объяснить свою идею, реализуя этот код? - person ozge; 03.11.2017
comment
Допустим, это число 225. Это число состоит из 3 цифр, потому что log_10(225) = 2.35 (округление в большую сторону = 3). Первая цифра получается путем выполнения (225 - 25) / 100 = 2. Вы получаете 25 с 225 modulo 100 = 25, а 100 — это 10 в степени позиции 10^2 = 100. Кроме того, я исправил небольшую ошибку, из-за которой такие числа, как 10000, не срабатывали. - person Jean B.; 03.11.2017