Как заполнить массив случайными числами
Перейти к содержимому

Как заполнить массив случайными числами

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

Сегодняшний материал я вновь посвящаю массивам, а именно их заполнению. Заполнять будем случайными значениями. Вначале поработаем с одномерным массивом, а затем с двумерным.

Заполнить одномерный массив.

Эта операция очень простая. Мы в цикле перебираем все элементы и присваиваем им случайное значение.

Заполнить двумерный массив.

Эта операция не сложнее:

Пример заполнения одномерного и двумерного массива.

Давайте напишем небольшую программку. Создайте новый проект и на форме разместите следующие компоненты:

  • 2 Button
  • Edit
  • Memo

У меня получилось примерно так:

Отмечу, что мы заполняем элементы массива целыми случайными числами. Если есть необходимость генерировать дробные числа или числа из интервала – можете почитать тут.

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

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

user avatar

user avatar

Если С++ — то там теперь в стандарт входит надежная и эффективная библиотека <random> . Если на C — то надо использовать только встроенный генератор rand() или писать свой, опираясь, скажем, на Кнута. Конечно, это не абсолютно случайные числа, а псевдослучайные.

Ваш вопрос не очень точен — например, какое распределение чисел в матрице должно быть? Равномерное, нормальное или какое еще?

Обычно это выглядит как

Ну, или, скажем, для случайных чисел в диапазоне от A до B (только B-A+1 не должно превышать RAND_MAX ) —

Генерация псевдослучайных последовательностей

Если необходимо сгенерировать последовательность в диапазоне [M1; M2], то используется формула:

Number = rand()%(M2-M1+1) + M1;

где Number – генерируемое число. M2-M1+1 – полный диапазон представления чисел. M1 – смещение указанного диапазона относительно 0; % — остаток от деления.

Например, если требуется сгенерировать последовательность в диапазоне [-10;10], то вызов функции будет выглядеть как

В результате получения остатка от деления на 21 имеем число от 0 до 20. Вычитая из полученного числа 10, получим число в искомом диапазоне [-10;10].

Однако генерируемая функцией rand() последовательность будет иметь один и тот же вид при каждом запуске программы.

Для генерации различных последовательности при каждом запуске программы необходимо проинициализировать глобальную переменную next значением, отличным от 1. С этой целью используется функция
void srand( unsigned int seed)
< next = seed; >
Чтобы инициализация next при каждом запуске программы была различной в качестве аргумента seed чаще всего используется текущее время.

Пример Заполнить массив из 20 элементов случайными числами в диапазоне от 0 до 99.

Результат выполнения
Генерация случайных чисел

Алгоритм перемешивания

Часто возникает задача расставить уже имеющийся набор значений в произвольном порядке. С этой целью также используется генератор псевдослучайных чисел. При этом создается массив и заполняется значениями.
Сама процедура перемешивания происходит следующим образом. Генерируется два значения индексов массива случайным образом, и значения элементов с полученными индексами меняются местами. Процедура повторяется не менее N раз, где N — количество элементов массива.
В качестве примера рассмотрим перемешивание 20 значений (от 1 до 20) и повторим процедуру 20 раз.

Реализация на Си

Результат выполнения
Алгоритм перемешивания

Алгоритм произвольного выбора

Часто возникает задача произвольного выбора ранее заданных элементов массива. Причем необходимо предусмотреть отсутствие повторений в выборе этих элементов.
Алгоритм такого выбора состоит в следующем:

  • Выбираем произвольно индекс элемента массива
  • Если элемент с таким индексом уже был ранее выбран, двигаемся вправо, пока не дойдём до следующего не выбранного элемента. При этом следим за тем, чтобы «движение вправо» не вышло за границы массива. Если фиксируется выход за границы массива, начинаем просмотр элементов массива с начала.
  • Выбираем элемент
  • Фиксируем элемент как выбранный
  • Повторяем указанные действия для всех остальных элементов

Реализации на Си
В результате получаем новый массив b , сформированный произвольной выборкой элементов массива a .

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 20
int main() <
int a[SIZE];
int b[SIZE]; // результирующий массив
srand(time( NULL ));
// Заполняем массив последовательными значениями от 1 до 20
for ( int i = 0; i < SIZE; i++)
<
a[i] = i + 1;
printf( "%2d " , a[i]);
>

for ( int i = 0; i < SIZE; i++)
<
int ind = rand() % 20; // выбираем произвольный индекс
while (a[ind] == -1) // пока элемент "выбран"
<
ind++; // двигаемся вправо
ind %= 20; // если дошли до правой границы, возвращаемся в начало
>
b[i] = a[ind]; // записываем следующий элемент массива b
a[ind] = -1; // отмечаем элемент массива a как "выбранный"
>
printf( "\n" );
// Выводим получившийся массив
for ( int i = 0; i < SIZE; i++)
printf( "%2d " , b[i]);
getchar();
return 0;
>

Результат выполнения
Алгоритм произвольного выбора

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *