Генератор случайных чисел на C++

Узнайте, как генерировать случайные числа в C++ с интерактивными примерами кода. Изучите rand(), srand(), библиотеку <random>, std::uniform_int_distribution и std::mt19937 с подробными объяснениями.

Редактор кода C++

Узнайте, как генерировать случайные числа в C++ с интерактивными примерами кода. Изучите rand(), srand(), библиотеку <random>, std::uniform_int_distribution и std::mt19937 с подробными объяснениями.

#include <iostream>
#include <random>

int main() {
    int min = 1;
    int max = 100;
    int quantity = 5;

    // Modern C++ random number generation
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(min, max);

    std::cout << "Modern C++ random numbers:" << std::endl;
    for (int i = 0; i < quantity; i++) {
        int num = dis(gen);
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

Вывод

Это предпросмотр в браузере, не выполнение Java или C++. Значения не подходят для криптографии.

Предпросмотр примера

Классический C++ с rand()

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

Нужно быстрое случайное число?

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

Открыть генератор случайных чисел

Понимание генерации случайных чисел в C++

Алгоритм rand() зависит от реализации. В C++11 движки, например std::mt19937, отделены от распределений; у распределения нет движка mt19937 по умолчанию.

rand() Function

Алгоритм rand() зависит от реализации. В C++11 движки, например std::mt19937, отделены от распределений; у распределения нет движка mt19937 по умолчанию.

<random> Library

Библиотека <random> (C++11+) обеспечивает современную генерацию случайных чисел с std::mt19937 (Mersenne Twister), различными распределениями, такими как uniform_int_distribution, и лучшим качеством случайности, чем rand().

uniform_int_distribution

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

std::mt19937

Алгоритм rand() зависит от реализации. В C++11 движки, например std::mt19937, отделены от распределений; у распределения нет движка mt19937 по умолчанию.

Распространённые примеры использования

Игры и симуляции

Генерация случайных бросков кубиков, вытягивания карт, процедурная генерация и игровые события с помощью rand() или современной библиотеки <random> в игровых циклах и симуляциях.

Безопасность и криптография

rand() и std::mt19937 не предназначены для криптографии. Для задач безопасности используйте документированную криптобиблиотеку или API ОС; std::random_device не даёт переносимой гарантии безопасности.

Высокопроизводительные вычисления

Современная библиотека <random> с std::mt19937 обеспечивает отличную производительность для генерации больших количеств случайных чисел в HPC и приложениях научных вычислений.

Тестирование ПО

Создание рандомизированных тестовых данных, входных данных для фаззинга и граничных случаев для обеспечения надёжного покрытия кода и обнаружения ошибок в C++ приложениях.

Как работает генерация случайных чисел в C++

Алгоритм rand() зависит от реализации. В C++11 движки, например std::mt19937, отделены от распределений; у распределения нет движка mt19937 по умолчанию.

Алгоритм rand() зависит от реализации. В C++11 движки, например std::mt19937, отделены от распределений; у распределения нет движка mt19937 по умолчанию.

std::random_device зависит от реализации и может использовать детерминированный движок. Непредсказуемость на каждой платформе не гарантируется.

Практические советы

🎯

Избегайте rand() в новом коде

Алгоритм rand() зависит от реализации. В C++11 движки, например std::mt19937, отделены от распределений; у распределения нет движка mt19937 по умолчанию.

🔒

Выбирайте зерно явно

Фиксированное зерно воспроизводит ту же последовательность движка. Движки C++ не получают системную энтропию автоматически; при необходимости задайте зерно явно.

⚡

Используйте подходящие распределения

Для равномерных целочисленных диапазонов используйте std::uniform_int_distribution. Для чисел с плавающей точкой используйте std::uniform_real_distribution. Это обеспечивает корректные статистические свойства.

Технические характеристики

Алгоритмы

  • Алгоритм rand() зависит от реализации. В C++11 движки, например std::mt19937, отделены от распределений; у распределения нет движка mt19937 по умолчанию.
  • Мерсенн Твистер (std::mt19937)
  • std::random_device зависит от реализации и может использовать детерминированный движок. Непредсказуемость на каждой платформе не гарантируется.

Характеристики производительности

  • rand(): Быстро, но низкое качество случайности
  • <random>: Быстро с отличным качеством
  • std::mt19937: Очень быстро для больших количеств

Часто задаваемые вопросы

Какие подходы C++ рассматриваются?

Классический rand() с srand(), современной библиотекой <random>, std::uniform_int_distribution и механизмом mt19937.

Могу ли я адаптировать примеры?

Да. Установите минимум, максимум и количество на панели параметров и запустите, чтобы увидеть результат.

Какой подход рекомендуется сегодня?

Библиотека <random> с именованным дистрибутивом и движком; rand() сохраняется в старом коде, но имеет проблемы с низким качеством и диапазоном.

Как мне заполнить генератор?

std::random_device зависит от реализации и может использовать детерминированный движок. Непредсказуемость на каждой платформе не гарантируется.

Какой диапазон возвращает rand() в C++?

rand() возвращает значения от 0 до RAND_MAX включительно. Проверьте платформу: Microsoft CRT использует 32767; в других реализациях предел может отличаться.

Является ли rand() криптографически безопасным?

rand() и std::mt19937 не предназначены для криптографии. Для задач безопасности используйте документированную криптобиблиотеку или API ОС; std::random_device не даёт переносимой гарантии безопасности.

Как генерировать случайные числа с плавающей запятой в C++?

Совместите std::mt19937 с std::uniform_real_distribution, настроенной на нужный интервал, например от 0.0 до 1.0, а затем вызовите dist(generator). Результатом будет double, у которого нижняя граница включена, а верхняя исключена.

Является ли rand() потокобезопасным в C++?

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

C++ standard draft: rand / srand · C++ standard draft: random_device · C++ standard draft: uniform_int_distribution

Источники и ресурсы

  • C++ <random> Reference - cppreference

    Официальная справочная документация по библиотеке генерации псевдослучайных чисел C++.

  • Mersenne Twister - Wikipedia

    Алгоритм Mersenne Twister, лежащий в основе большинства библиотек случайных чисел.