Генератор случайных чисел на 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() (из ) использует алгоритм линейного конгруэнтного генератора (LCG). Она производит псевдослучайные числа по формуле: 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 и позже) предпочтительнее использовать библиотеку вместо rand()/srand(). Она обеспечивает лучшую случайность, большую гибкость и потокобезопасные операции.

🔒

Всегда инициализируйте 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: Очень быстро для больших количеств