|
Вопрос # 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();
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|