Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 101

/ вопрос открыт /

Здравствуйте, Уважаемые Эксперты!

Подскажите, пожалуйста, как наиболее гибко и эффективно организовать "выдачу" чего-либо (пусть это будет текстовое сообщение) с вероятностью n%?

Например, нужно вывести одно из 4 сообщений:
"абв" с вероятностью 30%,
"где" с вероятностью 20%,
"жзи" с вероятностью 15%,
"клм" с вероятностью 35%.

Языковая реализация не важна - лишь бы был качественный и гибкий алгоритм (циклы, условия, массивы, простые rand'ы, арифметика, логика и иже с ними), а перевод на целевой язык сложности не представит.

p.s.: посоветуйте, если можно, на какую тему стоит почитать книжки, чтобы понять предложенный Вами метод решения.

Arti Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Arti (статус: Посетитель)
Вопрос отправлен: 19 августа 2009, 09:54
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 19 августа 2009, 10:44; участников в обсуждении: 3.
Dron

Dron (статус: Студент), 19 августа 2009, 09:58 [#1]:

Самое просто - сгенерировать число от 1 до 100 и посмотреть, в какой интервал оно попало:
n:=Random(100)+1;
case n of
1..30: 'абв';
31..50: 'где';
51..65: 'жзи';
else 'клм';
end;
Там, где текстовые строки, естественно, должны быть какие-то команды.
С уважением.
Arti

Arti (статус: Посетитель), 19 августа 2009, 10:19 [#2]:

Хмм, просто и классно. :)
Сперва я почему-то сомневался, что такая реализация действительно даёт нужный эффект, однако математически всё сошлось.
Большое спасибо!

Вы говорите, что это самое простое? Есть ещё и другие методы?
Dron

Dron (статус: Студент), 19 августа 2009, 10:25 [#3]:

Ну и самое главное - вызвать Randomize(), чтобы генерируемые варианты различались. Но об этом вы наверняка знаете.

Цитата (Arti):

Есть ещё и другие методы?

Навскидку ничего принципиально другого в голову не приходит. Ну а вариантов с обработкой случайных чисел можно придумать много - заполнить массив и выбирать случайный элемент и т.п.
С уважением.
Arti

Arti (статус: Посетитель), 19 августа 2009, 10:30 [#4]:

Про рандомизацию, к счастью, знаю.

Dron, в таком случае предложенный Вами метод и является оптимальным на мой взгляд.
В свою очередь, массивы могут пригодится, если у нас будет заранее неизвестное число "сообщений" и их вероятностей, т.к. массивы можно "обойти". Вроде так?
Dron

Dron (статус: Студент), 19 августа 2009, 10:35 [#5]:

Да, если неизвестное, то case'ом уже не отделаться, а вот динамические массивы как раз придут на помощь - заполнить вариантами с количеством в нужной пропорции, а потом просто взять любой элемент.
Вроде когда-то делал нечто подобное, вот только не могу вспомнить, где именно и с какой целью. Но задача в принципе несложная.
С уважением.
Вадим К

Вадим К (статус: Академик), 19 августа 2009, 10:44 [#6]:

Цитата:

Ну и самое главное - вызвать Randomize()

Все таки напомню, что эту функцию надо вызывать всего один раз при старте программы. А то надятся индивидумы, которые вызывают в цикле. "случайности" это не добавляет, а я бы сказал, даже уменьшает.
Паралельно напишу о популярном методе. Если надо показать какое то одно сообщение с заданной вероятностью (припустим 0.35), то применяют такую конструкцию.
if random() < 0.35 then do_some_actiono();
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:50
Выполнено за 0.03 сек.