#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()
, что будет неправильным использованием генератора.