Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2011, 22:16   #1
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию вероятность выпадения в процентах

Предположим у меня есть массив мне надо сделать так, чтоб вероятность выпадения того, или иного элемента была столько-то процентов как это организовать? Пока пришло в голову создать еще структуру(или обект) и хранить в ней промежуток с какого по какой(элемент один вероятность 5% 1-5, элемент два вероятность 9% 6-15...), сгенирировать рандомное число и проверять если оно больше стольких-то но меньше стольких-то то(это я буду смотреть в стрктуре) показываю это ну так в циле... мб можно еще как-то можно?
ololo-schoolboy вне форума Ответить с цитированием
Старый 24.01.2011, 23:07   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Все структуры это тоже объекты . Но эт так.

Делаешь класс, хранящий в себе массив пар объектов и вероятностей (std:air) и делаешь там метод randomObject(). Также можно перегрузить оператор [] для лёгкости обращения с таким классом.

В таких задачах лучше вводить "вес".

Сложно объяснить словами, поэтому приведу пример: если у A вес 1 и у B вес 1, вероятность их выпадения равна. Если у A вес 1, а у B вес 2, то вероятность выпадения B — 66%. Если вес у A — 1, у B — 1, а у C — 2, то вероятности будут 25%, 25%, 50%. Это удобно тем, что алгоритмы легки в написании.

Суть ясна? Могу написать тебе такой класс, если хочешь...
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 25.01.2011, 17:14   #3
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

спасибо, но я не нашел randomObject и мне хочется понять как это делается в принципе, а не в какой либо библиотеке
ololo-schoolboy вне форума Ответить с цитированием
Старый 25.01.2011, 17:26   #4
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Что значит не нашёл? Я просто сказал, как стоит назвать метод, который предлагается написать . Никакой библиотеки . Просто сказал название теоретического метода.

То есть так: у нас есть 5 элементов, вес у 1-3 по одному, у 4 и 5 по 2.
Общий вес — 1+1+1+2+2=7.
Вероятности выпадения у 1го, 2го и 3го элементов — по 1/7.
У 4го и 5го элементов — по 2/7.
Генерируем случайное число от 1 до 7.
Если это 1, то возвращаем 1й элемент, 2 - 2й, 3 - 3й, 4 или 5 — 4й, 6 или 7 — 5й.

Теперь-то понял?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 25.01.2011, 20:49   #5
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

Не понял чем это принципиально отличается от изложенного мной в первом посте
ololo-schoolboy вне форума Ответить с цитированием
Старый 25.01.2011, 20:49   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Obey-Kun +1


Ещё посмотрите темку -
вывод рандомного числа с большей или меньшей вероятностью
(там, правда, пример на Delphi, но общую идею можно уловить)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.01.2011, 20:54   #7
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Я тебе алгоритм предложил. Ещё 1 способ:

Скажем, еслу у объектов 1-3 вес по 1, а у 4-5 по 2, то можно воспользоваться временным массивом указателей:
&1 &2 &3 &4 &5 &5 &6 &6
И из этого массива с помощью randomiterator брать указатель. Так-то.

Но в целом всё сводится к одному. У тебя должен быть класс YourClass со следующими публичными методами:
Код:
T &randomObject() //ссылка на случайный объект
T &operator[] ( size_t i ) //доступ к элементам по номеру
YourClass<T> &operator<< (const T &obj, uint weigth) //добавить объект object с весом weight
А как его реализовывать внутри, это уже сам решай . Как минимум там внутри стоит держать приватный std::list< std:air<T, uint> > m_contents.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 25.01.2011 в 21:11.
Obey-Kun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длина колонки StringGrid в процентах KLOP Общие вопросы Delphi 4 27.04.2010 12:35
Подпрограмма определяющая вероятность выпадения счастливого билетика. Doublefaced Помощь студентам 9 05.08.2009 15:00
Делфи(Консоль) и C# - Подпрограммы(Вероятность выпадения «счастливого билетика» ) Doublefaced Помощь студентам 3 30.06.2009 22:15
Накрутка в процентах xgss Microsoft Office Excel 2 06.01.2009 17:28
Найти (в процентах) частоту появления каждого из m наиболее часто встречающихся элементов sk1p Паскаль, Turbo Pascal, PascalABC.NET 2 26.09.2008 23:57