статический и случайный генератор на c

#c #random #static #mt19937

Вопрос:

 #include <iostream>
#include <random>

int gen_ran(void)
{
    static std::random_device rd;
    static std::mt19937 gen(rd());
    static std::uniform_int_distribution<int> dist(0, 9);
    return dist(gen);
}

int main()
{
    for (int i = 0; i < 50; i  )
    {
        std::cout << gen_ran() << " ";
        if ((i   1) % 10 == 0)
            std::cout << std::endl;
    }
}
 

Я не совсем понимаю, почему мы можем поместить статику в каждую из трех строк в функции gen_ran (). Я много гуглил, но, похоже, четких ответов нет.

Насколько я понимаю, используя статику, мы инициализируем объекты только один раз, но алгоритмы внутри каждого класса (random_device, mt19937, uniform_int_distribution) все еще могут генерировать случайные числа. Таким образом, статика может сэкономить некоторые ресурсы компьютера, когда функция вызывается много раз?

Как насчет того, чтобы я не использовал статику или использовал один или два в коде? Имеет ли какое-то значение, если я этого не сделаю в каждом конкретном случае? Большое спасибо.

Комментарии:

1. Пожалуйста, откройте учебник для студентов C и попробуйте найти главу «Что static означает в области действия функции» (обратите внимание, что в глобальной области это имеет другое значение).

2. Я читал об этом за последние несколько дней, но все еще не совсем ясно. Я чувствую, что статика, используемая в данном случае, связана с инициализацией объекта и сохранением его там до конца программы? Не является статической переменной в области действия функции? Или все в основном одинаково, так как в c все обычно рассматривается как объект? Еще раз спасибо!

3. static имеет много разных вкусов в зависимости от контекста. Это действительно ответ на задачу минимизации количества ключевых слов в C и C . В контексте вашей программы static инициализирует переменную при первом ее обнаружении элементом управления программой. Концептуально, после инициализации, он выдерживает заключительную скобку main .

Ответ №1:

Операторы, начинающиеся с static , выполняются только один раз, и это происходит, когда поток программы сначала достигает операторов. Это приводит к тому, что генератор настраивается ровно один раз, что включает в себя посев.

Если вы их не сделаете static , то случайная последовательность будет повторно инициализироваться при каждом вызове gen_ran() , что будет неправильным использованием генератора.