Re: торможу...
- From
- Alexander Efremov (2:6090/11.9)
- To
- Alexey Cheglyakov
- Date
- 2002-07-22T20:36Z
- Area
- RU.ALGORITHMS
Alexey Cheglyakov (20 Jul 02/01:57) -> All
in RU.ALGORITHMS
AC> Есть массив из неизвестного к-ва строк. Нужно за один проход
AC> случайным образом выбрать одну строку. Вероятность выбора для всех
AC> строк одинаковая.
AC> Усложнение задачи - для каждой строки имеется весовой коэфициент
AC> (целое число), повышающий вероятность выбора этой строки.
Я встречался с такой проблемой, когда писал генератор ников, смысл был такой: задавалась произв. длина имени и буквы в имени выбирались поочерёдно гласные и согласные. Сначала я выбирал буквы с помощью счётчика случайных чисел, но потом решил приблизить это дело к русскому языку, взял "Войну и мир" в электронном варианте, и провёл анализ количества в нём букв алфавита, результаты я занёс в массив весов. Дальше я использовал такой принцип:
если на линейке отметить n-1 чёрточек и произвольно ткнуть в любое место на линейке, то выбранная область будет хар-ся своей шириной(весом), чем больше область, тем больше вероятность попадения в неё, и наоборот.
|________|____|__|_________|_______|_____|_|_______|______|______|_______|____|
^
В приложении к твоему случаю алгоритм на Сях будет примерно такой:
#include <stdlib.h>
const N=10;
void main(void)
{
char string[N][100];
int w[N],wsum,i,chance;
..Инициализация строк и весов к ним..
for(i=0;i<N;i++) wsum+=w[i]; //Подсчёт суммы всех весов
chance=rand%wsum;//Выбор произвольной точки
i=0;
wsum=0;
while(chance>=wsum)//Нахождение позиции точки
{
wsum+=w[i];
i++;
}
}
В результате выполнения алгоритма выбранная строка будет - string[i-1]. Ну а если выбор всех строк равновероятен, то это то же самое, что все весы равны 1.
В таком случае выбираемая строка - string[rand%N].
Вот собственно говоря и всё, что я хотел сказать..
--- GoldED+/W32 1.1.4.7
* Origin: Чем меньше женщину мы любим, тем больше устает рука. (2:6090/11.9)