| 
| 
 | Вопрос # 3 101/ вопрос открыт / | 
 |  Здравствуйте, Уважаемые Эксперты!
 Подскажите, пожалуйста, как наиболее гибко и эффективно организовать "выдачу" чего-либо (пусть это будет текстовое сообщение) с вероятностью n%?
 
 Например, нужно вывести одно из 4 сообщений:
 "абв" с вероятностью 30%,
 "где" с вероятностью 20%,
 "жзи" с вероятностью 15%,
 "клм" с вероятностью 35%.
 
 Языковая реализация не важна - лишь бы был качественный и гибкий алгоритм (циклы, условия, массивы, простые rand'ы, арифметика, логика и иже с ними), а перевод на целевой язык сложности не представит.
 
 p.s.: посоветуйте, если можно, на какую тему стоит почитать книжки, чтобы понять предложенный Вами метод решения.
 
|  |   Вопрос задал: Arti (статус: Посетитель)Вопрос отправлен: 19 августа 2009, 09:54
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 19 августа 2009, 10:44; участников в обсуждении: 3. 
|   | Dron (статус: Студент), 19 августа 2009, 09:58 [#1]:Самое просто - сгенерировать число от 1 до 100 и посмотреть, в какой интервал оно попало: 
 n:=Random(100)+1;
case n of
1..30: 'абв';
31..50: 'где';
51..65: 'жзи';
else 'клм';
end;Там, где текстовые строки, естественно, должны быть какие-то команды. С уважением. |  
|   | Arti (статус: Посетитель), 19 августа 2009, 10:19 [#2]:Хмм, просто и классно.  Сперва я почему-то сомневался, что такая реализация действительно даёт нужный эффект, однако математически всё сошлось.
 Большое спасибо!
 
 Вы говорите, что это самое простое? Есть ещё и другие методы?
 |  
|   | Dron (статус: Студент), 19 августа 2009, 10:25 [#3]:Ну и самое главное - вызвать Randomize(), чтобы генерируемые варианты различались. Но об этом вы наверняка знаете. 
 Цитата (Arti): Есть ещё и другие методы? Навскидку ничего принципиально другого в голову не приходит. Ну а вариантов с обработкой случайных чисел можно придумать много - заполнить массив и выбирать случайный элемент и т.п.
 С уважением. |  
|   | Arti (статус: Посетитель), 19 августа 2009, 10:30 [#4]:Про рандомизацию, к счастью, знаю. 
 Dron, в таком случае предложенный Вами метод и является оптимальным на мой взгляд.
 В свою очередь, массивы могут пригодится, если у нас будет заранее неизвестное число "сообщений" и их вероятностей, т.к. массивы можно "обойти". Вроде так?
 |  
|   | Dron (статус: Студент), 19 августа 2009, 10:35 [#5]:Да, если неизвестное, то case'ом уже не отделаться, а вот динамические массивы как раз придут на помощь - заполнить вариантами с количеством в нужной пропорции, а потом просто взять любой элемент. Вроде когда-то делал нечто подобное, вот только не могу вспомнить, где именно и с какой целью. Но задача в принципе несложная.
 С уважением. |  
|   | Вадим К (статус: Академик), 19 августа 2009, 10:44 [#6]: Цитата: Ну и самое главное - вызвать Randomize() Все таки напомню, что эту функцию надо вызывать всего один раз при старте программы. А то надятся индивидумы, которые вызывают в цикле. "случайности" это не добавляет, а я бы сказал, даже уменьшает.
 Паралельно напишу о популярном методе. Если надо показать какое то одно сообщение с заданной вероятностью (припустим 0.35), то применяют такую конструкцию.
 
 if random() < 0.35 then do_some_actiono(); Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |