![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Luyan |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
Доброго времени суток.
Использовал в С++ прошлого стандарта rand(), а srand() делал глобально. srand() менял в цикле и получал различные результаты (для усреднения и тд). Есть проект, несколько классов и все вызывают rand() в различных местах. Но теперь появилась потребность в некоторых классах кое-где использовать нормальное распеределение, вместо равномерного. Поэтому начал переводить код на C++11 с их рандомом и использовать uniform_real_distribution и normal_distribution. Вот как было раньше, упрощенный пример:
А вот как я пытаюсь делать сейчас:
Но это почему-то не работает - выдает нули. В чем ошибка? Как я понимаю, в C++11 надо везде таскать за собой generator? Или есть другие способы, кроме глобального объявления? |
||||
|
|||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Каждый раз создаётся std::uniform_int_distribution<int>, попробуй его сделать членом класса B, а создание перенести в конструктор. -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
Luyan |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
Создание в смысле установки параметров? или сделать поле dist указателем и через new в конструкторе выделять? сделал так:
Код все равно выдает 0:
А generator типа default_random_engine можно просто делать членом класса? или есть какие-нибудь ограничения? похоже в этом проблема. В сети ничего стоящего по этой теме не могу найти, все останавливаются на примерчиках в main. |
||||
|
|||||
akizelokro |
|
||||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Да просто и genertor'ы и все виды distribution'ов в новом стандарте уже сами классы, в стандарте уже сделана работа, которую ты пытаешься повторить, по идее просто делай, как указано в примерах. Потому что по моему имхо ты делаешь не совсем нужное усложнение.
Потом же смотри, судя по твоему листингу у тебя постоянно идёт сообщение из конструктора
то есть, ты ещё где-то код изменил. Смысл моего предложения был в том, чтобы uniform_int_distribution не пересоздавался каждый раз, потому что с этой мутью я уже сталкивался в том плане, что эти генераторы и распределения псевдослучайны и тупо повторяютя на первом шагу. А если бы ты брал второй шаг, было бы уже другое Понял, это у тебя в
где ты при каждом вызове создаёшь класс B по новой. Сделай экземпляр класса B членом класса А и посмотри.
-------------------- a = a + b; b = a - b; a = a - b; |
||||||
|
|||||||
Luyan |
|
||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
Вот за эту фразу большое спасибо. Проверил, действительно:
Выдает:
Хорошо, что это не справедливо для вещественных типов:
Короче, с классами тоже все работает. Спасибо. |
||||||||
|
|||||||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Да я столкнулся сам как-то раз с таким поведением для Visual Studio, правда, как я от этого ушёл для int'ов, надо смотреть. А тут у тебя наслоилось всё это, что ты "дёргал" только первую цифру. Ну, я и подумал, что это из той темы, а даже не из ошибок, но до конца не был уверен, потому что дело было давно. Скажем так, что-то меня подталкивало подозревать..
-------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |