Случайные числа в языке программирования С++ могут быть сгенерированы функцией 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() , причём он сгенерирует случайное число один раз, при первом запуске программы. В дальнейшем, сколько бы Вы не запускали эту программу, сгенерированное число останется одним и тем же.
# Введение в Python 3 | Урок 7 | Генератор случайных чисел random |
Рисунок 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. srand. rand задать диапазон. srand time null. Генератора случайных чисел. randomize. Урок #29.
Функция rand() выполняется с масштабированием, причём минимальное число из желаемого диапазона равно единице, а ширина выборки равна 3-м. Таким образом, наш диапазон от 1 до 3, включительно. Результат работы программы (см. Рисунок 2).
Рисунок 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 ).
Рисунок 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()
Источник: cppstudio.com
Алгоритмы рандома
В этой статье вы увидите самые разнообразные велосипеды алгоритмы для генерации случайных чисел.
Про что статья
Про алгоритмы генерирующие псевдослучайные числа, которые отличаются между собой качеством результата и скоростью исполнения. Статья будет полезна тем, кто хочет получить высокопроизводительную генерацию чисел в своих программах или разработчикам софта для микроконтроллеров и старых платформ по типу ZX Spectrum или MSX.
C++ rand
Первое что узнаёт начинающий программист С++ по теме получения рандома — функция rand, которая генерирует случайное число в пределах от 0 и RAND_MAX. Константа RAND_MAX описана в файле stdlib.h и равна 32’767, но этом может быть не так, например в Linux (см. коммент). Если же rand() в вашем компиляторе генерирует числа в пределах 32’767 (0x7FFF) и вы хотите получить случайное число большого размера, то код ниже можно рассматривать как вариант решения этой проблемы:
int64_t A = rand(); A
Реализация функции rand в старом C была проста и имела следующий вид:
static unsigned long int next = 1; int rand() < next = next * 1103515245 + 12345; return (unsigned int)(next / 65536) % 32768; >
Данная реализация имела не очень хорошее распределение чисел и ныне в C++ улучшена. Так же стандартная библиотека C++ предлагает дополнительные способы получения случайного числа, о которых ниже.
С++11 STL random
Случайное число. Генератор на C++
Возможность генерации случайных чисел необходима для работы некоторых программ, например, игр или приложений научно-статистического моделирования. В игре без рандомных событий монстры будут атаковать вас одинаково, вы будете постоянно находить одни и те же артефакты и т. д. Именно поэтому уметь генерировать случайные числа — обязанность любого программиста.
Случайные и псевдослучайные числа. В чём разница?
В реальной жизни, чтобы получить случайный результат мы кидаем кости или тасуем колоду карт. Итог будет зависеть от множества физических переменных (силы тяжести, трения, сопротивления воздуха, мастерства игрока и т. п.). Во многих смыслах мы действительно получаем случайный результат, ведь спрогнозировать его почти невозможно.
У компьютеров всё иначе. Они находятся в строго контролируемом цифровом мире, где существуют лишь два значения: правда и ложь. Именно поэтому ПК изначально создан для получения прогнозируемого результата. Следовательно, он неспособен генерировать случайные числа в полном смысле этого слова. Однако компьютер может имитировать случайность, а достигается это путём использования генераторов псевдослучайных чисел.
Что такое генератор случайных чисел?
Генератор случайных (псевдослучайных) чисел, он же ГСЧ (ГСПЧ) — это программа, принимающая начальное значение и выполняющая с этим значением ряд математических операций, что приводит к конвертации числа в другую цифру, отличную от стартовой. После этого программа применяет новое сгенерированное значение для дальнейших математических операций с последующей генерацией очередного числа, не связанного ни с первым, ни со вторым. И так далее. Таким образом, алгоритм генерирует ряд новых чисел, которые будут нам казаться действительно случайными.
Простой алгоритм случайных чисел
Написать простейший генератор случайных чисел несложно. Вот как выглядит программа на C++, которая позволяет генерировать 100 рандомных чисел:
#include unsigned int PRNG() < // Начальное число — 4 541 static unsigned int seed = 4541; // Берём начальное число и генерируем новое значение // Из-за применения очень больших чисел (и переполнения) угадать следующее число, исходя из предыдущего, довольно сложно seed = (8253729 * seed + 2396403); // Берём начальное число и возвращаем значение в диапазоне от 0 до 32 767 return seed % 32768; >int main() < // Выводим 100 случайных чисел for (int count=0; count < 100; ++count) < std::cout >
А вот результат:
Каждое число в этом ряду кажется нам случайным по отношению к предыдущему. Однако, говоря по правде, данный алгоритм достаточно примитивен.
Но зачем изобретать велосипед, когда для генерации у нас есть специальные функции?
Функции srand() и rand()
В языки программирования C и C++ встроены собственные генераторы случайных чисел. Реализованы они с помощью двух отдельных функций, которые находятся в заголовочном файле cstdlib: 1) srand() . Устанавливает значение, передаваемое пользователем, в качестве стартового. Вызывается лишь 1 раз: в начале программы (как правило, в верхней части функции main()) ;
2) rand() . Обеспечивает генерацию следующего случайного числа в имеющейся последовательности. Число будет находиться в промежутке от нуля до RAND_MAX (это константа в cstdlib, значение которой составляет 32 767).
Источник: otus.ru