|
| Дата |
|
USD/RUB | 88.4375 | BTC/USD | 68098.4442 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
26.12.2009, 21:25
|
Start Post: Зачатки TDS - распределение по %
|
hustle
Регистрация: 02.05.2008
Адрес: 3d world
Сообщений: 12,870
Бабло: $1717315
|
Как правильно это делать в % соотношении? Хелп!
|
|
|
26.12.2009, 22:38
|
#12
|
Senior Member
Регистрация: 29.09.2009
Сообщений: 406
Бабло: $93280
|
Цитата:
Сообщение от kanscx
Ага а 23 и 77 ты как поделишь таким образом?
|
да уж, проблема
1 ему, (77/23)*тому
|
|
|
26.12.2009, 22:52
|
#13
|
Senior Member
Регистрация: 11.07.2007
Сообщений: 2,073
Бабло: $134959
|
если rand(1,100) < 77 - ему
иначе - тому
|
|
|
26.12.2009, 22:54
|
#14
|
Je suis moine ivre
Регистрация: 03.03.2009
Сообщений: 15,243
Бабло: $797172957
|
Nou, случайные числа на то и случайные, что часто неравномерны.
|
|
|
26.12.2009, 23:33
|
#15
|
hustle
Регистрация: 02.05.2008
Адрес: 3d world
Сообщений: 12,870
Бабло: $1717315
ТС -->
|
ТС
1 url = 10%
2 url = 20%
3 url = 30%
4 url = 40%
1 url = 20%
2 url = 25%
3 url = 25%
4 url = 30%
|
|
|
26.12.2009, 23:40
|
#16
|
Je suis moine ivre
Регистрация: 03.03.2009
Сообщений: 15,243
Бабло: $797172957
|
Hector, ну самый простой вариант - находим наибольший общий делитель у коэффициентов весов, делим и показываем полученное количество раз подряд.
Например, твой первый случай - наибольшее общее кратное 10 =>
1 url = 1 раз
2 url = 2 раза
3 url = 3 раза
4 url = 4 раза
повторить
Для второго случая это 5 =>
1 url = 4 раза
2 url = 5 раза
3 url = 5 раза
4 url = 6 раза
повторить
Разумеется, максимальной равномерности можно добиться, распределяя урлы как можно более разреженно, но это надо писать скрипт или гуглить, что впадло. Как вариант - глянь исходники OpenX или лучше какую-нить банерокрутилку попроще, главное, чтобы можно было веса расставлять и показы генерились не с помощью рандома
P.S. Ну и на нескольких k максимальная разреженность, думаю, не критична, достаточно метода с наибольшим общим делителем.
|
|
|
27.12.2009, 00:06
|
#17
|
Senior Member
Регистрация: 27.10.2008
Сообщений: 758
Бабло: $94811
|
Цитата:
Сообщение от Drunk Monk
Hector, ну самый простой вариант - находим наибольший общий делитель у коэффициентов весов, делим и показываем полученное количество раз подряд.
Например, твой первый случай - наибольшее общее кратное 10 =>
1 url = 1 раз
2 url = 2 раза
3 url = 3 раза
4 url = 4 раза
повторить
Для второго случая это 5 =>
1 url = 4 раза
2 url = 5 раза
3 url = 5 раза
4 url = 6 раза
повторить
Разумеется, максимальной равномерности можно добиться, распределяя урлы как можно более разреженно, но это надо писать скрипт или гуглить, что впадло. Как вариант - глянь исходники OpenX или лучше какую-нить банерокрутилку попроще, главное, чтобы можно было веса расставлять и показы генерились не с помощью рандома
P.S. Ну и на нескольких k максимальная разреженность, думаю, не критична, достаточно метода с наибольшим общим делителем.
|
Причем здесь общий делитель? 57 на 43 общий делитель какой? Надо от общей суммы всех долей отталкиваться
|
|
|
27.12.2009, 00:10
|
#18
|
Читатель
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
|
Для получения случайного элемента массива с учетом весового распределения использую данную функцию:
PHP код:
// $arr - массив с данными
// $weights - массив "весов" к данным
function weight_rand($arr, $weights)
{
if(!is_array($arr) || count($arr) < 1) return false;
$sum = 0; $result = null;
do{
foreach($arr as $i => $data) {
$sum += $weights[$i];
if (rand(0, $sum) < $weights[$i]) {
$result = $data;
}
}
} while(is_null($result));
return $result;
}
Следует учитывать что процентное распределение - частный случай весового, т.е. просто когда сумма всех весов равна 100.
|
|
|
27.12.2009, 00:12
|
#19
|
Je suis moine ivre
Регистрация: 03.03.2009
Сообщений: 15,243
Бабло: $797172957
|
дел
|
|
|
27.12.2009, 00:23
|
#20
|
hustle
Регистрация: 02.05.2008
Адрес: 3d world
Сообщений: 12,870
Бабло: $1717315
ТС -->
|
ТС
dveredel, вот это наверное то что нужно, завтра только получится потестировать... спасибо!
|
|
|
27.12.2009, 00:46
|
#21
|
Бабло победит зло
Регистрация: 20.06.2008
Сообщений: 2,579
Бабло: $346045
|
Цитата:
Сообщение от kanscx
Ага а 23 и 77 ты как поделишь таким образом?
|
Легко
PHP код:
<?php $t1 = "1 тому"; $t2 = "1 этому";
$t1percent = 77; $t2percent = 23;
for($i=0; $i<100; $i++) { if($t1percent > 0) { echo $t1." "; $t1percent--; continue; }
if($t2percent > 0) { echo $t2." "; $t2percent--; } }
?>
Результат:
PHP код:
1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 тому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому 1 этому
|
|
|
|