Мастера, подскажите плиз как лучше сделать следующее: имеется таблица (см. приложение), в которой каждой строке сопостален рейтинг. нужно выбрать случайную строку, чтобы вероятнось её выбора равнялась её рейтингу делённому на сумму рейтингов... т.е. чтобы в данном случае выбиралась так: первая строка - вероятнось выбрать - 145/(145+23+45) = 0.68 вторая строка - вероятнось выбрать - 23/(145+23+45) = 0.11 третья строка - вероятнось выбрать - 45/(145+23+45) = 0.21
Добрый день, dvp! Самое простое решение (я не уверен что лучшее) - это создать массив, в котором соответсвующие элементы будут встречатся так часто насколько более велик его рейтинг, а потом выбирать из этого массива обыкновенным mt_rand ( 0 , count($array) - 1 ) Что это значит: в вашем случае можно взять массив из 10 элементов (это менее точно) или из 100 элементов (менее экономично) и в цикле заполнить 7( или 68) элементов значением 145, 1 (11) элемент - значением 23 и 2 (21) элемента - значением 45, а уже из выбранного массива выбирать случайный элемент с индексом mt_rand ( 0 , 9) или mt_rand ( 0 , 99).
Ответ отправлен: 18.10.2004, 09:43 Отправитель: Vril Отвечает Strory
Доброе время суток, dvp! Могу предложить алгоритм, а писать лень :( Вобщем, высчитываем вероятности выбора и запихиваем в массив следующее(для предложенного варианта): $a[0] => 0.00; $a[1] => 0.68; // 0 + 0.68 $a[2] => 0.79; // 0.68 + 0.11 $a[3] => 1.00; // 0.79 + 0.21
Затем берем случайное число в диапозоне 0..1 и смотрим в цикле, попадает ли это число в диапозон от $a[$i-1]..$a[i]. Должен быть вариант и получше, но пока в голову больше ничего не пришло... Ответ отправлен: 18.10.2004, 19:25 Отправитель: Strory
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.