Генератор случайных чисел на C++
Узнайте, как генерировать случайные числа в C++ с интерактивными примерами кода. Изучите rand(), srand(), библиотеку <random>, std::uniform_int_distribution и std::mt19937 с подробными объяснениями.
Нужно быстрое случайное число?
Попробуйте наш онлайн-генератор случайных чисел для мгновенных результатов без написания кода.
Редактор кода C++
Узнайте, как генерировать случайные числа в C++ с интерактивными примерами кода. Изучите rand(), srand(), библиотеку <random>, std::uniform_int_distribution и std::mt19937 с подробными объяснениями.
Вывод
Симулированный вывод (C++ работает на сервере)
Нажмите «Выполнить код» для просмотра примера вывода
Классический C++ с rand()
Используйте традиционную функцию rand() из <cstdlib> для генерации случайных целых чисел. Простая и широко поддерживаемая, хотя и не подходит для криптографических приложений из-за низкого качества случайности.
Понимание генерации случайных чисел в C++
C++ предоставляет несколько способов генерации случайных чисел, развиваясь от простой функции rand() в C до современной библиотеки <random> в C++11. Классический rand() использует линейный конгруэнтный генератор (LCG) и инициализируется с помощью srand(), в то время как современный подход использует алгоритм Mersenne Twister и предоставляет различные классы распределений для разных случаев.
rand() Function
Классическая функция rand() из <cstdlib> обеспечивает простую генерацию псевдослучайных чисел. Инициализируется с помощью srand(), использует алгоритм линейного конгруэнтного генератора (LCG). Подходит для базовых приложений, но не для криптографических целей.
<random> Library
Библиотека <random> (C++11+) обеспечивает современную генерацию случайных чисел с std::mt19937 (Mersenne Twister), различными распределениями, такими как uniform_int_distribution, и лучшим качеством случайности, чем rand().
uniform_int_distribution
std::uniform_int_distribution обеспечивает точный контроль целочисленных диапазонов с равномерным распределением. Идеально для статистических приложений, симуляций и когда требуется точный контроль диапазона.
std::mt19937
std::mt19937 реализует алгоритм Mersenne Twister, обеспечивая отличные статистические свойства и очень длинный период (2^19937-1). Это движок по умолчанию для большинства распределений <random>.
Распространённые примеры использования
Игры и симуляции
Генерация случайных бросков кубиков, вытягивания карт, процедурная генерация и игровые события с помощью rand() или современной библиотеки <random> в игровых циклах и симуляциях.
Безопасность и криптография
Для приложений безопасности рассмотрите использование специализированных криптографических библиотек. Стандартный rand() не является криптографически безопасным. Используйте платформенно-зависимые генераторы безопасных случайных чисел для паролей и токенов.
Высокопроизводительные вычисления
Современная библиотека <random> с std::mt19937 обеспечивает отличную производительность для генерации больших количеств случайных чисел в HPC и приложениях научных вычислений.
Тестирование ПО
Создание рандомизированных тестовых данных, входных данных для фаззинга и граничных случаев для обеспечения надёжного покрытия кода и обнаружения ошибок в C++ приложениях.
Как работает генерация случайных чисел в C++
Классическая функция C++ rand() (из next = (a * current + c) % m. Последовательность детерминирована и должна быть инициализирована с помощью srand().
Современная библиотека (C++11+) использует алгоритм Mersenne Twister (std::mt19937), который обеспечивает значительно лучшее качество случайности и статистические свойства. Она также предлагает различные классы распределений: uniform_int_distribution, normal_distribution и bernoulli_distribution для разных случаев.
std::random_device предоставляет платформенно-зависимый источник энтропии для инициализации генераторов случайных чисел, обеспечивая различные последовательности при каждом запуске программы.
Советы экспертов по генерации случайных чисел в C++
Избегайте rand() в новом коде
Для нового кода C++ (C++11 и позже) предпочтительнее использовать библиотеку
Всегда инициализируйте srand()
При использовании rand() всегда вызывайте srand(std::time(0)) в начале программы для инициализации генератора. Иначе вы будете получать одну и ту же последовательность каждый раз. С библиотекой
Используйте подходящие распределения
Для равномерных целочисленных диапазонов используйте std::uniform_int_distribution. Для чисел с плавающей точкой используйте std::uniform_real_distribution. Это обеспечивает корректные статистические свойства.
Технические характеристики
Алгоритмы
- Линейный конгруэнтный генератор (функция rand)
- Mersenne Twister (std::mt19937)
- Платформенно-зависимый источник энтропии (std::random_device)
Характеристики производительности
- rand(): Быстро, но низкое качество случайности
- <random>: Быстро с отличным качеством
- std::mt19937: Очень быстро для больших количеств