Проблема с генератором случайных чисел
Генератор случайных чисел работает на так как мне бы хотелось :(
Имеется базовый класс CAnimal.
Вот его конструктор :
CAnimal() // Standart constructor
{
ClassName = "CAnimal";
srand((unsigned)time( NULL ));
int i = rand() % 20;
X=i;
i = rand() % 20;
Y=i;
srand((unsigned)time( NULL ));
}
Два другие класса производные от CAnimal.
В OnNewDocument() создаю объекты производных классов, но переменные-члены X и Y у них получаются одиннаковые. (пары X и Y одиннаковы для всех объетов).
Как это исправить ?
Подскажите, в чем проблема :
Генератор случайных чисел работает на так как мне бы хотелось :(
Имеется базовый класс CAnimal.
Вот его конструктор :
CAnimal() // Standart constructor
{
ClassName = "CAnimal";
srand((unsigned)time( NULL ));
int i = rand() % 20;
X=i;
i = rand() % 20;
Y=i;
srand((unsigned)time( NULL ));
}
Два другие класса производные от CAnimal.
В OnNewDocument() создаю объекты производных классов, но переменные-члены X и Y у них получаются одиннаковые. (пары X и Y одиннаковы для всех объетов).
Как это исправить ?
на самом деле отсюда надо и первый srand убрать. Вынеси его куда нить где он исполняется только раз за все время жизни процесса (или потока?). :). Например в InitInstance. Если это MFC конечно.
Зарефактрорив твой код :
где нить в InitInstance:
////////////////////////////////////////////
{
ClassName = "CAnimal";
X = rand() % 20
Y = rand() % 20;
}
а то в предыдущем случае перерасход стековой памяти для конструктора получается. А так какая никая экономия. :)
на самом деле отсюда надо и первый srand убрать. Вынеси его куда нить где он исполняется только раз за все время жизни процесса (или потока?). :). Например в InitInstance. Если это MFC конечно.
Зарефактрорив твой код :
где нить в InitInstance:
////////////////////////////////////////////
{
ClassName = "CAnimal";
X = rand() % 20
Y = rand() % 20;
}
а то в предыдущем случае перерасход стековой памяти для конструктора получается. А так какая никая экономия. :)
Опять зарефакторив констуктор ( Гради Буч называл это итеративным процессом ).
#define Y_SIZE 20
где нить в объявлении класса :
class CAnimal {
static const char* ClassName;
};
определение :
const char* CAnimal::ClassName = "CAnimal";
CAnimal() // Standart constructor
{
X = rand() % X_SIZE
Y = rand() % Y_SIZE;
}
но вообще для динамичекого определение типа на этапе выполнения рекомендую воспользовать dynamic_cast. Но если RTTI ( Run-Time Type Idenitification ) все таки понадбилось то это уже не гоод.....
Причем тут перерасход?! Просто у него все конструкторы выполняются в течении одной единицы времени.
Причем тут перерасход?! Просто у него все конструкторы выполняются в течении одной единицы времени.
????? Одной единицы времени ???????? это как ????? в чем измеряются эти единицы ???? и кто их отмеряет ???? а ты знаешь что такое стековая память ? то бишь просто стек в котором хранятся локальные переменные .... которые в данном случае исходя из приведенного примера оказываются лишними.....хотя к генератору случайных чисел это не имеет непосредственное отношение....хотя какое то отношение все таки есть :D ( все абсолютно со смыслом ).
????? Одной единицы времени ???????? это как ????? в чем измеряются эти единицы ???? и кто их отмеряет ????
Не выкабенивайся, ты должен понимать о чем речь, если нет - почитай про архитектуру процессора, там ты найдешь ответы.
Там всего одна локальная.
Вот это верно!
У парня не было проблем со стеком он просто спросил почему переменные одинаковые.
Твоя рекомендация правильная, только объяснение мутное.
Не выкабенивайся, ты должен понимать о чем речь, если нет - почитай про архитектуру процессора, там ты найдешь ответы.
Не знаю о каких там вы процессорах говорили, но у меня проц один и насколько я знаю эту архитектуру , то он у мя за такт выполняет одну операцию ;)
И как мне кажется вряд ли оба конструктора выполняются в одно время. ( IMHO )
to PitxBull : Cпасибо все заработало.
зы. только не пойму в чем здесь заключается оптимизация :(
#define X_SIZE 20
#define Y_SIZE 20
...
CAnimal() // Standart constructor
{
X = rand() % X_SIZE
Y = rand() % Y_SIZE;
}
pls поясни .
Не знаю о каких там вы процессорах говорили, но у меня проц один и насколько я знаю эту архитектуру , то он у мя за такт выполняет одну операцию ;)
И как мне кажется вряд ли оба конструктора выполняются в одно время. ( IMHO )
to PitxBull : Cпасибо все заработало.
зы. только не пойму в чем здесь заключается оптимизация :(
pls поясни .
Он имелл ввиду введение ненужной 4-х байтной переменной int i(а затем ненужные копирования из буффера в нужную переменную) в локальный стек конструктора (хотя и если убрать ее не очень то большая экономия,если только ты не вызываеш данных конструкторов штук 100000 )
Все эти вопросы мне понадобились для задачки "Волчий остров" . Если интересно посмотрите тему "ХОЧУ ЗНАТЬ ТВОЕ МНЕНИЕ".
Не знаю о каких там вы процессорах говорили, но у меня проц один и насколько я знаю эту архитектуру , то он у мя за такт выполняет одну операцию ;)
И как мне кажется вряд ли оба конструктора выполняются в одно время. ( IMHO )
Ну не прямо в одно, но по крайней мере в течении одной секунды. Этого достаточно для приведенного кода.
x = rand();
srand((unsigned)time(NULL));
y = rand();
99.9999..% гарантировано выполнение равенства: x==y, т.к. инициализация генератора сл.чисел производится оба раза одним числом и дальнейшие вызовы rand() будут давать одинаковые рез-ты.
Не выкабенивайся, ты должен понимать о чем речь, если нет - почитай про архитектуру процессора, там ты найдешь ответы.
Слышь AI, ты за свой базар вообще отвечаешь ? :D Рекомендую еще почитать теорию относительности :D
Там всего одна локальная.
А я разве утверждал что то другое ? :D
Вот это верно!
У парня не было проблем со стеком он просто спросил почему переменные одинаковые.
Твоя рекомендация правильная, только объяснение мутное.
Сам ты мутный :D
Слышь AI, ты за свой базар вообще отвечаешь ? :D Рекомендую еще почитать теорию относительности :D
Да ладно ты, расслабся уже.
Ты от темы уже отошел. Флеймить еще вздумал. Ну детский сад, ей богу!