| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > default_random_engine и классы |
| Автор: Luyan 15.12.2013, 13:48 | ||||
| Доброго времени суток. Использовал в С++ прошлого стандарта rand(), а srand() делал глобально. srand() менял в цикле и получал различные результаты (для усреднения и тд). Есть проект, несколько классов и все вызывают rand() в различных местах. Но теперь появилась потребность в некоторых классах кое-где использовать нормальное распеределение, вместо равномерного. Поэтому начал переводить код на C++11 с их рандомом и использовать uniform_real_distribution и normal_distribution. Вот как было раньше, упрощенный пример:
А вот как я пытаюсь делать сейчас:
Но это почему-то не работает - выдает нули. В чем ошибка? Как я понимаю, в C++11 надо везде таскать за собой generator? Или есть другие способы, кроме глобального объявления? |
| Автор: akizelokro 15.12.2013, 17:26 | ||
Каждый раз создаётся std::uniform_int_distribution<int>, попробуй его сделать членом класса B, а создание перенести в конструктор. |
| Автор: Luyan 15.12.2013, 19:24 | ||||
Создание в смысле установки параметров? или сделать поле dist указателем и через new в конструкторе выделять? сделал так:
Код все равно выдает 0:
А generator типа default_random_engine можно просто делать членом класса? или есть какие-нибудь ограничения? похоже в этом проблема. В сети ничего стоящего по этой теме не могу найти, все останавливаются на примерчиках в main. |
| Автор: akizelokro 15.12.2013, 21:30 | ||||||
| Да просто и genertor'ы и все виды distribution'ов в новом стандарте уже сами классы, в стандарте уже сделана работа, которую ты пытаешься повторить, по идее просто делай, как указано в примерах. Потому что по моему имхо ты делаешь не совсем нужное усложнение. Потом же смотри, судя по твоему листингу у тебя постоянно идёт сообщение из конструктора
то есть, ты ещё где-то код изменил. Смысл моего предложения был в том, чтобы uniform_int_distribution не пересоздавался каждый раз, потому что с этой мутью я уже сталкивался в том плане, что эти генераторы и распределения псевдослучайны и тупо повторяютя на первом шагу. А если бы ты брал второй шаг, было бы уже другое Понял, это у тебя в
где ты при каждом вызове создаёшь класс B по новой. Сделай экземпляр класса B членом класса А и посмотри.
|
| Автор: akizelokro 16.12.2013, 12:19 |
| Да я столкнулся сам как-то раз с таким поведением для Visual Studio, правда, как я от этого ушёл для int'ов, надо смотреть. А тут у тебя наслоилось всё это, что ты "дёргал" только первую цифру. Ну, я и подумал, что это из той темы, а даже не из ошибок, но до конца не был уверен, потому что дело было давно. Скажем так, что-то меня подталкивало подозревать.. |