функция srand в классе

Я изучаю C++ и не могу найти ответ на свой вопрос. Когда я запускаю свой код, я не получаю никаких ошибок компилятора, но я, когда я вызываю функцию «getVin ()» (предполагаемая для генерации случайного числа с использованием функции «генерировать ()»), это не делает так. Выводит ноль. Вот мой класс (из заголовочного файла):

class Vehicle {
public:
    Vehicle();
    static int generate();
    const int getVin () { return m_vin; }

protected:
    float m_lla[3];
    const int m_vin = s_idgen;

private:
    static int s_idgen;
};

И определение (из исходного файла):

int Vehicle::s_idgen = generate();

Vehicle::Vehicle() {
    m_lla[3] = 0;
}

int Vehicle::generate() {
    srand((int)time(0));
    return (rand() % 10000) + 1;
}

Любой совет будет полезен, спасибо!


person LCKDWN    schedule 11.10.2017    source источник
comment
Вы должны вызывать srand только один раз. Например, функция time обычно возвращает время в секундах, а это означает, что если вы вызываете функцию generate несколько раз в течение одной секунды, вы сбрасываете начальное значение на одно и то же значение и получаете одно и то же случайное число. Кроме того, C++ имеет гораздо лучшие средства псевдослучайной генерации, чем обычные srand и rand , и я рекомендую вам использовать их вместо этого.   -  person Some programmer dude    schedule 11.10.2017
comment
Подумайте об этом: когда это происходит? const int m_vin = s_idgen; А когда устанавливается s_idgen?   -  person juanchopanza    schedule 11.10.2017
comment
Не думайте, что вопрос дублирует предложенный вопрос: проблема OP связана не с повторным вызовом srand, а с порядком инициализации статической переменной, согласно ответу @Serge Ballesta.   -  person Gian Paolo    schedule 11.10.2017


Ответы (2)


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

Vehicle sveh; // static scoped

сразу после объявления транспортного средства и перед определением любого метода или статического поля, а затем

int main() {
    Vehicle veh;
    std::cout << veh.getVin() << std::endl;
    std::cout << sveh.getVin() << std::endl;
    return 0;
}

Выход:

1915
0

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

person Serge Ballesta    schedule 11.10.2017

В шапке делаешь:

protected:
  const int m_vin = s_idgen;

в то время как в исходном файле вы делаете:

int Vehicle::s_idgen = generate();

Когда происходит инициализация m_vin, каково значение s_idgen? generate() еще не установил. Попробуйте распечатать его, чтобы увидеть, что я имею в виду.

Попробуйте вернуть s_idgen напрямую из вашей функции.


PS: рассмотрите возможность использования <random> вместо традиционных C-функций.

person gsamaras    schedule 11.10.2017