Генерация случайных чисел cpp

Генерирование случайных чисел. Функции rand() , srand() , time() . Примеры

В языке C++ существуют средства для генерирования случайных чисел. Чтобы сгенерировать случайное число используется функция rand() , которая размещается в библиотечном файле stdlib.h . Синтаксис объявления функции следующий:

Функция возвращает случайное целочисленное значение, которое лежит в пределах от 0 до 32767.

#include #include using namespace std; void main() < // Получить случайное число int x; x = rand(); cout "x color: #008000;">// Получить еще одно случайное число int y; y = rand(); cout "y color: #333300;">⇑ 
2. Функция srand(). Назначение. Пример

Если несколько раз запустить текст программы из п. 1, то будет получен один и тот же результат (одни и те же числа). Значит, сама по себе функция rand() генерирует одни и те же последовательности чисел. Чтобы получить разные последовательности чисел нужно объединить функцию rand() с функцией srand().

Функция srand() из библиотеки stdlib.h предназначена для установки начальной точки, из которой происходит генерирование случайных чисел. Синтаксис объявления функции следующий:

void srand(unsigned int startValue);

здесь startValue – целочисленное значение, которое служит отправной точкой для генерирования последовательности случайных чисел функцией rand() . Изменяя значение startValue , можно получать разные последовательности случайных чисел.

#include #include using namespace std; void main() < // Установить начальную точку генерирования последовательности srand(55); // Получить случайное число int x; x = rand(); cout "x color: #008000;"> // Получить еще одно случайное число int y; y = rand(); cout "y color: #333300;">⇑ 
3. Функция time(). Назначение. Сочетание функций rand(), srand(), time(). Пример

Как видно из примера в п. 2, последовательность случайных чисел изменилась. Если в функции srand() вместо числа 55 установить другое число, то будет получена другая последовательность. Однако, текст программы статический и при многократном запуске программы это число будет неизменным. В результате будет получаться одна и та же последовательность случайных чисел. Во избежание этого недостатка, нужно чтобы стартовое значение в функции srand() постоянно изменялось.

Для того, чтобы в функции srand() получить разные начальные значения используется функция time() из библиотеки time.h.

Если функцию time() вызвать с параметром NULL, то эта функция возвратит количество миллисекунд, которые прошли с 1 января 1970 года. Значит, число миллисекунд будет зависеть от момента времени, в который пользователь запустил программу на выполнение. А этот момент каждый раз будет другим.

Если эти миллисекунды поместить в функцию srand() как показано ниже

srand(time(NULL));

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

Пример. В примере демонстрируется генерирование последовательности из двух случайных чисел. Каждый раз при запуске программы будет получена новая последовательность.

4. Как сгенерировать случайное целое число в заданных пределах? Пример

В примере приведена функция GetRandomNumber() , которая генерирует случайное число в заданных пределах.

5. Заполнение двумерной матрицы случайными целыми числами в указанных пределах. Пример

Условие задачи. Дана двумерная матрица порядка n ( n столбцов, n строк) целых чисел. Найти наибольшее из значений элементов, которые размещены в закрашенной части матрицы. Значение элементов матрицы формируются случайным образом и находятся в пределах [-5; +5].

Текст программы следующий

6. Как сгенерировать случайное число с плавающей запятой в указанных пределах? Пример

В примере демонстрируется функция GetRandomNumberFloat() , которая генерирует случайное число с плавающей запятой в указанных пределах.

Связанные темы

Источник

Генератор случайных чисел rand() в С++

Случайные числа в языке программирования С++ могут быть сгенерированы функцией rand() из стандартной библиотеки С++. Функция rand() генерирует числа в диапазоне от 0 до RAND_MAX . RAND_MAX — это константа, определённая в библиотеке . Для MVS RAND_MAX = 32767, но оно может быть и больше, в зависимости от компилятора. Ниже показана простая программка, использующая генератор случайных чисел rand() (см. Рисунок 1).

// random.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < cout 

В строке 9 значение константы RAND_MAX выталкивается в поток вывода, так мы сможем посмотреть максимальное значение из интервала случайных чисел. В строке 10 запускается генератор случайных чисел rand() , причём он сгенерирует случайное число один раз, при первом запуске программы. В дальнейшем, сколько бы Вы не запускали эту программу, сгенерированное число останется одним и тем же.

Генерация случайных чисел в С++

Рисунок 1 — Генератор случайных чисел rand()

Как видно из рисунка 1 максимальное случайное число — это 32767. Функция rand() сгенерировала число 41. Зачастую, нам не нужен такой большой диапазон чисел от 0 до RAND_MAX . Например, в игре «Наперстки» необходимо отгадать, под каким из трёх напёрстков спрятан шарик, то есть генерация чисел должна выполняться в пределе от 1 до 3-х. Бросая монету, может возникнуть только два случая, когда монета упадёт «орлом» или «решкой» вверх, нужный интервал — от 1 до 2. Возникает потребность в масштабировании интервала генерации случайных чисел. Для того чтобы масштабировать интервал генерации чисел нужно воспользоваться, операцией нахождения остатка от деления «%«.

// пример масштабирования диапазона генерации случайных чисел rand() % 3 +1 // диапазон равен от 1 до 3 включительно

Число 3 является масштабируемым коэффициентом. То есть, какое бы не выдал число генератор случайных чисел rand() запись rand() % 3 в итоге выдаст число из диапазона от 0 до 2. Для того чтобы сместить диапазон, мы прибавляем единицу, тогда диапазон изменится на такой — от 1 до 3 включительно.

// формула генерации случайных чисел по заданному диапазону random_number = firs_value + rand() % last_value; // где firs_value - минимальное число из желаемого диапазона // last_value - ширина выборки

Разработаем программу, использующую масштабируемый генератор случайных чисел. Ниже показан код программы, которая несколько раз запускает функцию rand() .

// rand_ost.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < cout 

Начиная с 9-й по 16-ю строки , включительно, выполняется запуск генератора случайных чисел rand() . В данной программе 8 раз был запущен генератор случайных чисел rand() с целью выявления случайности срабатывания. Функция rand() выполняется с масштабированием, причём минимальное число из желаемого диапазона равно единице, а ширина выборки равна 3-м. Таким образом, наш диапазон от 1 до 3, включительно. Результат работы программы (см. Рисунок 2).

Генератор случайных чисел rand() в С++

Рисунок 2 — Генератор случайных чисел rand()

Из рисунка 2 видно, что генератор случайных чисел rand() был запущен 8 раз. Из восьми раз:

  • тройка показалась три раза, P = 3/8 = 0.375 — вероятность появления тройки
  • двойка показалась три раза, P = 3/8 = 0.375 — вероятность появления двойки
  • единица показалась два раза, P = 2/8 = 0.25 — вероятность появления единицы

Все эти вероятности приблизительны, так как испытание проводилось только 8 раз, если вы попробуете у себя скомпилить данный код, то результат может получиться совсем другой.

При повторном запуске программы, печатаются те же самые числа. Суть в том, что функция rand() один раз генерирует случайные числа, а при последующих запусках программы всего лишь отображает сгенерированные первый раз числа. Такая особенность функции rand() нужна для того, чтобы можно было правильно отладить разрабатываемую программу. При отладке программы, внеся какие-то изменения, необходимо удостовериться, что программа срабатывает правильно, а это возможно, если входные данные остались те же, то есть сгенерированные числа. Когда программа успешно отлажена, нужно, чтобы при каждом выполнении программы генерировались случайные числа. Для этого нужно воспользоваться функцией srand() из стандартной библиотеки С++. Функция srand() получив целый положительный аргумент типа unsigned или unsigned int (без знаковое целое) выполняет рандомизацию, таким образом, чтобы при каждом запуске программы функция srand() генерировала случайные числа. Программа, использующая функцию srand() для рандомизации генератора случайных чисел rand() (см. Рисунок 3).

// srand.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < unsigned rand_value = 11; srand(rand_value); // рандомизация генератора случайных чисел cout 

В строке 10 выполняется функция srand() , которая принимает в качестве аргумента целое положительное число 11. При первом запуске мы получили случайные числа, и при последующих запусках программы мы видим всё те же числа. Так вот, чтоб каждый раз генерировались новые случайные числа необходимо, что бы менялся аргумент в функции srand() . На следующих рисунках наглядно можно посмотреть как меняются сгенерированные числа, относительно изменяющегося значения в переменной rand_value (см. Рисунки 3 и 4 ).

генератор случайных чисел rand() С++

Рисунок 3 — Генератор случайных чисел rand()

Генерация случайных чисел С++

Рисунок 4 — Генератор случайных чисел rand()

Из рисунков 3 и 4 видно, что при изменении значения rand_value меняются числа, причём в первом и во втором запусках функции rand() . То, что на рисунке 4 в первом случае осталось такое же случайное число — это совпадение.

И наконец, чтобы производить рандомизацию автоматически, то есть, не меняя каждый раз аргумент в функции srand() нужно воспользоваться функцией time() с аргументом 0.

// автоматическая рандомизация srand( time(0) );

Чтобы использовать функцию time() , необходимо подключить заголовочный файл .

Разработаем обобщённый пример использования автоматического генератора случайных чисел с масштабированием. Пример работы программы (см. Рисунок 5).

// srand_time.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv[]) < srand( time( 0 ) ); // автоматическая рандомизация cout

Теперь при каждом срабатывании программы будут генерироваться совершенно случайные числа в интервале от 1 до 10, включительно (см. Рисунок 5).

генерация случайных чисел С++

Рисунок 5 — Генератор случайных чисел rand()

Источник

rand

Создает псевдослучайное число. Доступна более защищенная программно версия этой функции; см. раздел rand_s . Числа, созданные , rand не являются криптографически безопасными. Для более безопасного создания случайных чисел криптографически используйте rand_s функции или , объявленные в стандартной библиотеке C++ в .

Синтаксис

Возвращаемое значение

Функция rand возвращает псевдослучайное число, как описано выше. Ошибка не возвращается.

Комментарии

Функция rand возвращает псевдослучайное целое число в диапазоне от 0 до RAND_MAX (32767). Используйте функцию srand для заполнения генератора псевдослучайных чисел перед вызовом rand .

Функция rand создает хорошо известную последовательность и не подходит для использования в качестве криптографической функции. Для более безопасного создания случайных чисел криптографически используйте rand_s функции или , объявленные в стандартной библиотеке C++ в .

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

Требования

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример

// crt_rand.c // This program seeds the random-number generator // with a fixed seed, then exercises the rand function // to demonstrate generating random numbers, and // random numbers in a specified range. #include // rand(), srand() #include // printf() void SimpleRandDemo(int n) < // Print n random numbers. for (int i = 0; i < n; i++) < printf(" %6d\n", rand()); >> void RangedRandDemo(int range_min, int range_max, int n) < // Generate random numbers in the interval [range_min, range_max], inclusive. for (int i = 0; i < n; i++) < // Note: This method of generating random numbers in a range isn't suitable for // applications that require high quality random numbers. // rand() has a small output range [0,32767], making it unsuitable for // generating random numbers across a large range using the method below. // The approach below also may result in a non-uniform distribution. // More robust random number functionality is available in the C++ header. // See https://learn.microsoft.com/cpp/standard-library/random int r = ((double)rand() / RAND_MAX) * (range_max - range_min) + range_min; printf(" %6d\n", r); > > int main(void) < // Seed the random-number generator with a fixed seed so that // the numbers will be the same every time we run. srand(1792); printf("Simple random number demo ====\n\n"); SimpleRandDemo(10); printf("\nRandom number in a range demo ====\n\n"); RangedRandDemo(-100, 100, 100000); >``` ```Output Simple random number demo ==== 5890 1279 19497 1207 11420 3377 15317 29489 9716 23323 Random number in a range demo ==== -82 -46 50 77 -47 32 76 -13 -58 90 

Источник

Читайте также:  Javascript foreach with key
Оцените статью