Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с генератором случайных чисел

1.9K
21 июля 2005 года
Nigger
71 / / 09.04.2005
Подскажите, в чем проблема :
Генератор случайных чисел работает на так как мне бы хотелось :(

Имеется базовый класс 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 одиннаковы для всех объетов).
Как это исправить ?
488
22 июля 2005 года
Mоngооsе
465 / / 01.04.2005
Второй srand() нужно убрать.
351
22 июля 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Nigger
Подскажите, в чем проблема :
Генератор случайных чисел работает на так как мне бы хотелось :(

Имеется базовый класс 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:

 
Код:
srand( (unsigned)time(NULL) );


////////////////////////////////////////////

 
Код:
CAnimal()   // Standart constructor
    {
        ClassName = "CAnimal";
        X = rand() % 20
        Y = rand() % 20;
    }


а то в предыдущем случае перерасход стековой памяти для конструктора получается. А так какая никая экономия. :)
351
22 июля 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by PitxBull
на самом деле отсюда надо и первый srand убрать. Вынеси его куда нить где он исполняется только раз за все время жизни процесса (или потока?). :). Например в InitInstance. Если это MFC конечно.

Зарефактрорив твой код :


где нить в InitInstance:

 
Код:
srand( (unsigned)time(NULL) );


////////////////////////////////////////////

 
Код:
CAnimal()   // Standart constructor
    {
        ClassName = "CAnimal";
        X = rand() % 20
        Y = rand() % 20;
    }


а то в предыдущем случае перерасход стековой памяти для конструктора получается. А так какая никая экономия. :)




Опять зарефакторив констуктор ( Гради Буч называл это итеративным процессом ).

Код:
#define X_SIZE 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 ) все таки понадбилось то это уже не гоод.....
12K
22 июля 2005 года
Al515
12 / / 22.07.2005
Цитата:
а то в предыдущем случае перерасход стековой памяти для конструктора получается. А так какая никая экономия. :)



Причем тут перерасход?! Просто у него все конструкторы выполняются в течении одной единицы времени.

351
22 июля 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Al515
Причем тут перерасход?! Просто у него все конструкторы выполняются в течении одной единицы времени.



????? Одной единицы времени ???????? это как ????? в чем измеряются эти единицы ???? и кто их отмеряет ???? а ты знаешь что такое стековая память ? то бишь просто стек в котором хранятся локальные переменные .... которые в данном случае исходя из приведенного примера оказываются лишними.....хотя к генератору случайных чисел это не имеет непосредственное отношение....хотя какое то отношение все таки есть :D ( все абсолютно со смыслом ).

12K
26 июля 2005 года
Al515
12 / / 22.07.2005
Цитата:
Originally posted by PitxBull
????? Одной единицы времени ???????? это как ????? в чем измеряются эти единицы ???? и кто их отмеряет ????


Не выкабенивайся, ты должен понимать о чем речь, если нет - почитай про архитектуру процессора, там ты найдешь ответы.

Цитата:
то бишь просто стек в котором хранятся локальные переменные .... которые в данном случае исходя из приведенного примера оказываются лишними.....


Там всего одна локальная.

Цитата:
хотя к генератору случайных чисел это не имеет непосредственное отношение....


Вот это верно!

У парня не было проблем со стеком он просто спросил почему переменные одинаковые.
Твоя рекомендация правильная, только объяснение мутное.

1.9K
26 июля 2005 года
Nigger
71 / / 09.04.2005
Цитата:
Originally posted by Al515
Не выкабенивайся, ты должен понимать о чем речь, если нет - почитай про архитектуру процессора, там ты найдешь ответы.



Не знаю о каких там вы процессорах говорили, но у меня проц один и насколько я знаю эту архитектуру , то он у мя за такт выполняет одну операцию ;)
И как мне кажется вряд ли оба конструктора выполняются в одно время. ( IMHO )

to PitxBull : Cпасибо все заработало.
зы. только не пойму в чем здесь заключается оптимизация :(

Цитата:

#define X_SIZE 20
#define Y_SIZE 20
...
CAnimal() // Standart constructor
{
X = rand() % X_SIZE
Y = rand() % Y_SIZE;
}


pls поясни .

406
26 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Nigger
Не знаю о каких там вы процессорах говорили, но у меня проц один и насколько я знаю эту архитектуру , то он у мя за такт выполняет одну операцию ;)
И как мне кажется вряд ли оба конструктора выполняются в одно время. ( IMHO )

to PitxBull : Cпасибо все заработало.
зы. только не пойму в чем здесь заключается оптимизация :(

pls поясни .




Он имелл ввиду введение ненужной 4-х байтной переменной int i(а затем ненужные копирования из буффера в нужную переменную) в локальный стек конструктора (хотя и если убрать ее не очень то большая экономия,если только ты не вызываеш данных конструкторов штук 100000 )

1.9K
26 июля 2005 года
Nigger
71 / / 09.04.2005
Спасибо всем.
Все эти вопросы мне понадобились для задачки "Волчий остров" . Если интересно посмотрите тему "ХОЧУ ЗНАТЬ ТВОЕ МНЕНИЕ".
12K
27 июля 2005 года
Al515
12 / / 22.07.2005
Цитата:
Originally posted by Nigger
Не знаю о каких там вы процессорах говорили, но у меня проц один и насколько я знаю эту архитектуру , то он у мя за такт выполняет одну операцию ;)
И как мне кажется вряд ли оба конструктора выполняются в одно время. ( IMHO )


Ну не прямо в одно, но по крайней мере в течении одной секунды. Этого достаточно для приведенного кода.

 
Код:
srand((unsigned)time(NULL));
x = rand();

srand((unsigned)time(NULL));
y = rand();

99.9999..% гарантировано выполнение равенства: x==y, т.к. инициализация генератора сл.чисел производится оба раза одним числом и дальнейшие вызовы rand() будут давать одинаковые рез-ты.
351
27 июля 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Al515
Не выкабенивайся, ты должен понимать о чем речь, если нет - почитай про архитектуру процессора, там ты найдешь ответы.



Слышь AI, ты за свой базар вообще отвечаешь ? :D Рекомендую еще почитать теорию относительности :D

Цитата:
Originally posted by Al515

Там всего одна локальная.



А я разве утверждал что то другое ? :D

Цитата:
Originally posted by Al515

Вот это верно!

У парня не было проблем со стеком он просто спросил почему переменные одинаковые.
Твоя рекомендация правильная, только объяснение мутное.



Сам ты мутный :D

12K
27 июля 2005 года
Al515
12 / / 22.07.2005
Цитата:
Originally posted by PitxBull
Слышь AI, ты за свой базар вообще отвечаешь ? :D Рекомендую еще почитать теорию относительности :D


Да ладно ты, расслабся уже.
Ты от темы уже отошел. Флеймить еще вздумал. Ну детский сад, ей богу!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог