Могу ли я использовать глобальную переменную вместо статической локальной переменной здесь?

Переменная «инициализируется» в методе initRandomSeed ()

/*
* File: random.cpp
* ----------------
* This file implements the random.h interface.
*/#include <cstdlib>
#include <cmath>
#include <ctime>
#include "random.h"#include "private/randompatch.h"using namespace std;

/* Private function prototype */

static void initRandomSeed();

/*
* Implementation notes: randomInteger
* -----------------------------------
* The code for randomInteger produces the number in four steps:
*
* 1. Generate a random real number d in the range [0 .. 1).
* 2. Scale the number to the range [0 .. N) where N is the number of values.
* 3. Translate the number so that the range starts at the appropriate value.
* 4. Convert the result to the next lower integer.
*
* The implementation is complicated by the fact that both the expression
*
*     RAND_MAX + 1
*
* and the expression for the number of values
*
*     high - low + 1
*
* can overflow the integer range.  These calculations must therefore be
* performed using doubles instead of ints.
*/

int randomInteger(int low, int high) {
initRandomSeed();
double d = rand() / (double(RAND_MAX) + 1);
double s = d * (double(high) - low + 1);
return int(floor(low + s));
}

/*
* Implementation notes: randomReal
* --------------------------------
* The code for randomReal is similar to that for randomInteger,
* without the final conversion step.
*/

double randomReal(double low, double high) {
initRandomSeed();
double d = rand() / (double(RAND_MAX) + 1);
double s = d * (high - low);
return low + s;
}

/*
* Implementation notes: randomChance
* ----------------------------------
* The code for randomChance calls randomReal(0, 1) and then checks
* whether the result is less than the requested probability.
*/

bool randomChance(double p) {
initRandomSeed();
return randomReal(0, 1) < p;
}

/*
* Implementation notes: setRandomSeed
* -----------------------------------
* The setRandomSeed function simply forwards its argument to srand.
* The call to initRandomSeed is required to set the initialized flag.
*/

void setRandomSeed(int seed) {
initRandomSeed();
srand(seed);
}

/*
* Implementation notes: initRandomSeed
* ------------------------------------
* The initRandomSeed function declares a static variable that keeps track
* of whether the seed has been initialized.  The first time initRandomSeed
* is called, initialized is false, so the seed is set to the current time.
*/

static void initRandomSeed() {
static bool initialized = false;
if (!initialized) {
srand(int(time(NULL)));
initialized = true;
}
}

Чтобы гарантировать, что код инициализации не выполняется каждый
время, вам нужен логический флаг, чтобы записать, что инициализация
был выполнен. К сожалению, это не работает, чтобы заявить, что
помечать как глобальную переменную, потому что C ++ не определяет порядок в
какие глобальные переменные инициализируются. Если вы объявляете другие глобальные
значения, начальные значения которых были получены случайным
библиотека, не было бы никакого способа гарантировать, что флаг инициализации
был установлен правильно.

Можете ли вы привести пример «Если вы объявляете другие глобальные
значения, начальные значения которых были получены случайным
библиотека, не было бы никакого способа гарантировать, что флаг инициализации
был установлен правильно. »

-2

Решение

Вы хотите выполнить поиск статической инициализации: https://cryptopp.com/wiki/Static_Initialization_Order_Fiasco

Например, если вы объявите глобальную переменную myInt:

int myInt = initRandomSeed ();

это будет выполнено до того, как ваша программа войдет в блок main (), и нет никакой гарантии, что initialized устанавливается до myInt

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]