В средах программирования или в приложениях электронных таблиц имеется возможность генерации случайного числа.
Рассмотрим получение случайных чисел:
Будем использовать среду программирования PascalABC.NET .
Решим также задачу с использованием случайного числа.
Выполним присваивание
При использовании такого выражения и переменной типа integer возникает ошибка.
Делаем вывод
Функция random выдает значение типа real в диапазоне [0; 1)
Значит для использования функции random и получения вещественного числа будет использовать переменную типа real.
Для получения целого числа воспользуемся присваиванием
В данном случае будут случайно сгенерированы первые 10 неотрицательных чисел в промежутке от 0 до 9.
Чтобы получить целое число из промежутка [a; b], воспользуемся формулой:
Пусть нужно получить случайное число из промежутка [-2; 10]
Формула примет такой вид:
-2 + random(10-(-2)+1) = -2 + random(13)
Как сгенерировать список случайных уникальных чисел. Python. Александр Килинкаров
Если random(13) сгенерирует 0, то будет получена левая граница промежутка -2 + 0 = -2, если random(13) сгенерирует 12, то будет получена правая граница -2+12 = 10.
Для получения случайного числа из промежутка также можно воспользоваться функцией random с двумя аргументами — левой и правой границами промежутка (в среде Free Pascal работать не будет) .
Задача. Получить 30 случайных чисел из промежутка [-2;12] и вывести их на экран.
Воспользуемся циклом for с счетчиком x от 1 до 30, сгенерируем и выведем на экран 30 случайных чисел.
Итоги
Как использовать функцию random для генерации случайного числа
- Вещественное число
Источник: reshupascal.blogspot.com
Псевдослучайные числа
В языках программирования обычно предусмотрены функции, позволяющие генерировать случайные числа в определенном по умолчанию диапазоне. На самом деле генерируются не случайные, а так называемые псевдослучайные числа; они выглядят случайно, но вычисляются по вполне конкретной формуле. Но для простоты далее мы все равно будем называть их случайными.
В языке программирования C получить случайное число можно с помощью функции rand() , которая входит в стандартную библиотеку языка. Эта функция не принимает никакие параметры.
Напишите программу, в которой целочисленной переменной присваивается результат выполнения функции rand() . Выведите значение переменной на экран.
Функция rand() возвращает целое число от 0 до значения присвоенного константе RAND_MAX. Значение RAND_MAX зависит от системы и определено в заголовочном файле stdlib.h. Так, например, оно может быть равно 32767 (двухбайтовое целое) или 2147483647 (четырехбайтовое целое).
Определите значение RAND_MAX в вашей системе. Для этого не забудьте подключить к файлу исходного кода заголовочный файл stdlib.h.
# Введение в Python 3 | Урок 7 | Генератор случайных чисел random |
Код ниже выводит на экран 50 случайных чисел:
#include #include int main () { char i; for (i = 1; i 50; i++) { printf(«%15d», rand()); if (i % 5 == 0) printf(«n»); } }
В теле цикла осуществляется переход на новую строку после каждых выведенных на экран пяти чисел. Для этого используется выражение, в котором находится остаток от деления i на 5, результат сравнивается с 0. Чтобы после первого числа не происходил переход на новую строку, iсначала присваивается единица, а не ноль (т.к. 0 делится на 5 без остатка).
Спишите код, приведенный выше. Выполните программу несколько раз, при этом обратите внимание, разные ли результаты вы получаете от выполнения к выполнению.
Вы должны были заметить, что при каждом запуске программы числа остаются одинаковыми. Даже если вы перекомпилируете программу, результат не изменится. Данный эффект связан с тем, что начальное (инициализирующее) число, которое подставляется в формулу вычисления первого и последующих псевдослучайных чисел, для каждой системы всегда одно и то же.
Однако это начальное число можно изменить с помощью функции srand() , которой в качестве параметра передается любое целое число. Понятно, что если вы зададите конкретный аргумент для функции, например, srand(1000) , то от вызова к вызову программы числа будут также одни и те же. Хотя и не те, что были бы без srand() . Поэтому появляется проблема, как сделать так, чтобы аргумент для srand() был тоже случайным? Получается замкнутый круг.
Переделайте программу, выводящую на экран 50 случайных чисел так, чтобы сначала у пользователя запрашивалось любое целое число с помощью scanf() , которое передавалось бы в функцию srand() .
Пользователь программы сам может задавать инициализирующее значение. Но чаще всего это не является полноценным выходом из ситуации. Поэтому инициализирующее значение привязывают к какому-либо процессу, протекающему в операционной системе, например, к часам. Время (учитывая не только время суток, но и дату) никогда не бывает одинаковым. Значит значение для srand() , преобразованное в целое из системного времени, будет различным.
Текущее время можно узнать с помощью функции time() , прототип которой описан в файле time.h. Передав time() в качестве параметра NULL, мы получим целое число, которое можно передать в srand() :
srand(time(NULL));
Переделайте вашу программу так, чтобы инициализирующее значение зависело от системного времени.
Получение целых случайных чисел в заданных диапазонах
Функция rand() выдает случайное число от 0 до значения RAND_MAX. Что делать, если требуется получать случайные числа в иных диапазонах, например, от 100 до 999?
Сначала рассмотрим более простую ситуацию: получить случайные числа от 0 до 5. Если любое целое число попытаться разделить на 5 нацело, то в качестве остатка можно получить как 0 (когда число делится на 5 без остатка), так и 1, 2, 3, 4. Например, rand() вернула число 283. Применяя к этому числу операцию нахождения остатка от деления на 5, получим 3. Т.е. выражение rand() % 5 дает любое число в диапазоне [0, 5).
Однако, что если надо, чтобы число 5 так же входило в диапазон, т.е. диапазон имеет вид [0, 5]? Логично предположить, что следует найти остаток от деления на 6. При этом более грамотным будет следующее рассуждение: надо находить остаток от деления на размер диапазона. В данном случае он равен шести значениям: 0, 1, 2, 3, 4, 5. Чтобы найти размер диапазона, надо из допустимого максимума вычесть допустимый минимум и прибавить единицу: max — min + 1. Будьте внимательны: если, например, требуется, чтобы указанный в задаче максимум не входил в диапазон, то единицу прибавлять не надо или надо вычитать единицу из максимума.
Напишите программу, выдающую 50 случайных чисел от 0 до 99 включительно.
Итак, мы знаем формулу получения длины диапазона: max — min + 1. Если требуется получить число от 6 до 10 включительно, то длина диапазона будет равна 10 — 6 + 1 = 5. Выражение rand()% 5 даст любое число от 0 до 4 включительно. Но нам надо от 6 до 10. В таком случае достаточно к полученному случайному остатку прибавить 6, т.е. минимум. Другими словами, надо выполнить сдвиг. Действительно для приведенного примера:
- если остаток был равен 0, то добавляя 6, получаем 6;
- остаток 1, добавляем 6, получаем 7;
- …
- остаток 4, прибавляем 6, получаем 10;
- остатка больше 4 не может быть.
В таком случае формула для получения случайного числа в диапазоне [a, b] выглядит так:
rand() % длина_диапазона + сдвиг
где длина_диапазона вычисляется как b — a + 1, сдвиг является значением a.
В эту формулу также вписываются случаи, когда необходимо получить случайное число от 0 до N, т.е. они являются ее частными случаями.
Выведите на экран ряд случайных чисел, принадлежащих диапазону от 100 до 299 включительно.
С таким же успехом можно получать случайные отрицательные числа. Действительно, если диапазон задан как [-35, -1], то его длина будет равна -1 — (-35) + 1 = 35, что соответствует действительности; выражение получения случайного числа будет выглядеть так:
rand() % 35 — 35
Так, если остаток от деления составил 0, то мы получим -35, а если 34, то -1. Остальные остатки дадут значения в промежутке от -35 до -1.
Выведите на экран ряд случайных чисел, принадлежащих диапазону от -128 до 127 включительно.
Получение вещественных случайных чисел
Ситуация с вещественными числами выглядит несколько по-иному. Во-первых, мы не можем получить остаток от деления, если делимое или делитель дробные числа. Во вторых при вычислении длины диапазона нельзя прибавлять единицу.
Поясним вторую причину. Допустим диапазон задан как [2.50, 5.30]. Он состоит не из определенного количества чисел (как в случае целых), а из неопределенного (можно сказать, бесконечного) числа значений, т.к. вещественные числа можно представлять с различной степенью точности. Позже выполняя округление все равно будет шанс получить максимальную границу диапазона, поэтому для вычисления длины диапазона достаточно из максимума вычесть минимум.
Если разделить случайное число, преобразованное к вещественному типу, которое выдала функция rand() , на значение константы RAND_MAX, то получится вещественное случайное число от 0 до 1. Теперь, если это число умножить на длину диапазона, то получится число, лежащее в диапазоне от 0 до значения длины диапазона. Далее если прибавить к нему смещение к минимальной границе, то число благополучно впишется в требуемый диапазон. Таким образом формула для получения случайного вещественного числа выглядит так:
(float) rand() / RAND_MAX * (max — min) + min
Заполните массив случайными числами в диапазоне от 0.51 до 1.00. Выведите значение элементов массива на экран.
Равновероятные случайные числа
Функция rand() генерирует любое случайное число от 0 до RAND_MAX с равной долей вероятности. Другими словами, у числа 100 есть такой же шанс выпасть, как и у числа 25876.
Чтобы доказать это, достаточно написать программу, подсчитывающую количество выпадений каждого из значений. Если выборка (количество «испытуемых») будет достаточно большой, а диапазон (разброс значений) маленьким, то мы должны увидеть, что процент выпадений того или иного значения приблизительно такой же как у других.
#include #include #define N 500 int main () { int i; int arr[5] = {0}; srand(time(NULL)); for (i=0; i N; i++) switch (rand() % 5) { case 0: arr[0]++; break; case 1: arr[1]++; break; case 2: arr[2]++; break; case 3: arr[3]++; break; case 4: arr[4]++; break; } for (i=0; i 5; i++) printf(«%d — %.2f%%n», i, ((float) arr[i] / N) * 100); }
В приведенной программе массив из пяти элементов сначала заполняется нулями. Случайные числа генерируются от 0 до 4 включительно. Если выпадает число 0, то увеличивается значение первого элемента массива, если число 1, то второго, и т.д. В конце на экран выводится процент выпадения каждого из чисел.
Спишите данную программу. Посмотрите на результат ее выполнения при различных значениях N: 10, 50, 500, 5000, 50000. Объясните увиденное.
Источник: younglinux.info
Генерация псевдослучайных последовательностей
Если необходимо сгенерировать последовательность в диапазоне [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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include
#include
#include
#define SIZE 20
int main() int a[SIZE];
srand(time( NULL ));
for ( int i = 0; i a[i] = rand() % 100;
printf( «%d » , a[i]);
>
getchar();
return 0;
>
Результат выполнения
Алгоритм перемешивания
Часто возникает задача расставить уже имеющийся набор значений в произвольном порядке. С этой целью также используется генератор псевдослучайных чисел. При этом создается массив и заполняется значениями.
Сама процедура перемешивания происходит следующим образом. Генерируется два значения индексов массива случайным образом, и значения элементов с полученными индексами меняются местами. Процедура повторяется не менее N раз, где N — количество элементов массива.
В качестве примера рассмотрим перемешивание 20 значений (от 1 до 20) и повторим процедуру 20 раз.
Реализация на Си
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include
#include
#include
#define SIZE 20
int main() int a[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 ind1 = rand() % 20;
int ind2 = rand() % 20;
// и меняем местами элементы с этими индексами
int temp = a[ind1];
a[ind1] = a[ind2];
a[ind2] = temp;
>
printf( «n» );
// Выводим получившийся массив
for ( int i = 0; i < SIZE; i++)
printf( «%2d » , a[i]);
getchar();
return 0;
>
Результат выполнения
Алгоритм произвольного выбора
Часто возникает задача произвольного выбора ранее заданных элементов массива. Причем необходимо предусмотреть отсутствие повторений в выборе этих элементов.
Алгоритм такого выбора состоит в следующем:
- Выбираем произвольно индекс элемента массива
- Если элемент с таким индексом уже был ранее выбран, двигаемся вправо, пока не дойдём до следующего не выбранного элемента. При этом следим за тем, чтобы «движение вправо» не вышло за границы массива. Если фиксируется выход за границы массива, начинаем просмотр элементов массива с начала.
- Выбираем элемент
- Фиксируем элемент как выбранный
- Повторяем указанные действия для всех остальных элементов
Реализации на Си
В результате получаем новый массив b , сформированный произвольной выборкой элементов массива a .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include
#include
#include
#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;
>
Результат выполнения
Источник: prog-cpp.ru