Nano Hash - криптовалюты, майнинг, программирование

Как часто я должен повторно использовать C++?

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

void func1()
{
    std::cout << "This is func1 " << std::rand() << std::endl;
}

void func2()
{
    std::cout << "This is func2 " << std::rand() << std::endl;
}

int main()
{
    std::srand(std::time(NULL));
    func1();
    func2();
    return 0;
}

Таким образом, я могу легко отключить раздачу из основной записи. Это полезно при отладке программы — результаты сохраняются каждый раз, когда я запускаю программу без заполнения. Иногда, если проблема возникает из-за какого-то случайного числа, она может просто исчезнуть, если нужно сгенерировать другой набор случайных чисел, поэтому я бы предпочел такой простой механизм для отключения заполнения.

Однако я заметил, что в новом наборе случайных утилит C++11 генератор случайных чисел должен быть создан перед использованием. (например, default_random_engine). И каждый раз генератор приходится засеивать отдельно. Интересно, действительно ли рекомендуется перезагружать генератор всякий раз, когда требуется новый генератор. Я знаю, что могу создать глобальный генератор случайных чисел и заполнить его только один раз, как и раньше, но мне вообще не нравится идея использования глобальных переменных. В противном случае, если я создам локальный генератор случайных чисел, я как бы потеряю возможность глобально отключить раздачу для отладки или любой другой цели.

Я взволнован, чтобы изучить новые возможности в C++11, но иногда это просто очень запутанно. Может ли кто-нибудь сообщить мне, если у меня что-то не так с новыми генераторами случайных чисел? Или что может быть лучшей практикой в ​​С++ 11?

03.03.2013

  • Иметь глобальную начальную функцию, которая возвращает либо текущее время, либо (в режиме отладки) константу. 03.03.2013

Ответы:


1

Одна из причин, по которой генератор случайных чисел (ГСЧ) требует создания экземпляра, заключается в том, что он может сохранять свое внутреннее состояние, таким образом, в многопоточном приложении вы не вводите недетерминизм, когда несколько потоков используют один и тот же ГСЧ с процессом. -глобальное государство. Предположим, у вас есть два потока, каждый из которых работает над независимыми частями задачи. Если состояние (начальное число) является частным для экземпляра ГСЧ, тогда вы можете иметь детерминизм, когда вы задаете ГСЧ каждого потока известным значением. С другой стороны, если ГСЧ хранит состояние в глобальной переменной, то последовательность случайных чисел, наблюдаемых каждым потоком, зависит от чередования их вызовов ГСЧ — теперь вы ввели недетерминизм.

Одним из шаблонов программирования, который используется для распределения работы в многопоточных приложениях, является пул потоков. Если рабочие элементы, поставленные в очередь для выполнения рабочих потоков в пуле, требуют ГСЧ, и вы хотите, чтобы выполнение было детерминированным от запуска к запуску, то вы хотите, чтобы каждый поток повторно заполнял ГСЧ после извлечения нового рабочего элемента из пула. очередь

  • это можно сделать как часть инициализации рабочего элемента
  • начальное значение может включать хеш-функцию параметров задания.
  • если вы внимательно относитесь к тому, как это закодировано, вы можете иметь псевдослучайность и детерминизм независимо от количества рабочих потоков или порядка, в котором они извлекают задания из очереди.

Вот вопрос SO, который касается этого: Детерминированный генератор случайных чисел привязан в экземпляр (независимый от потока)

В однопоточном приложении нет необходимости повторно задавать RNG, и на самом деле это нежелательно, потому что, делая это, вы сокращаете его цикл, прежде чем он начнет повторяться. Исключением из этого является то, что указал @MatthewSanders, Криптография - в этом случае вам нужна максимальная энтропия (наименьший детерминизм), потому что в качестве закрытых ключей используются случайные числа.

03.03.2013
  • Большое тебе спасибо! Кажется, я слишком долго работал с однопоточными приложениями. Теперь я убежден, что хочу оставить генератор случайных чисел отдельно для многопоточных приложений. 03.03.2013

  • 2

    Это, безусловно, будет зависеть от общих целей системы, которую вы разрабатываете, но в целом вам нужно будет заполнить любую систему, для которой требуется генератор случайных чисел (ГСЧ), только один раз при инициализации этой системы.

    В разработке игр обычно используется отдельный ГСЧ для каждой системы (ИИ, генераторы процедурного контента, частицы и т. д.), чтобы изолировать эту систему для отладки и обслуживания.

    Если вы храните начальные значения, вы также можете воспроизвести логику с очень небольшим количеством данных (требуется только дельта-ввод для каждого кадра). Это не только упрощает отладку приложения, но также позволяет поддерживать функции записи и воспроизведения для пользователя. Очевидно, что если бы вы создавали режим воспроизведения, системе необходимо было бы предоставить записанное начальное число для каждой из систем перед каждым сеансом воспроизведения.

    Существуют и другие системы, такие как криптография, в которых вы можете периодически устанавливать новое семя. Вы можете захотеть со временем истечь семя или потребовать, чтобы новое семя создавалось при каждом рукопожатии с клиентским приложением. Тем не менее, вы, вероятно, захотите использовать криптографическую библиотеку, поскольку она, вероятно, будет намного более надежной, чем то, что вы бы создали самостоятельно.

    03.03.2013
  • Потрясающий ответ, очень развёрнутый. +1 03.03.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..