Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Функция соответсвия весам
 
 автор: sidPR   (27.02.2008 в 09:52)   письмо автору
 
 

function distribute_no_rand($arr_1, $k){
$total = 0; // Длина всего отрезка, составленного из кирпичиков
$start = 0; // начало кирпичика
foreach ($arr_1 as $key =>$val){
$g[$key]['start'] = $start;
$g[$key]['finish'] = $start + $val;

$start = $g[$key]['finish'];
$total = $g[$key]['finish'] -1;
}
for($i=0; $i<$k; $i++){
$rand = rand(0,$total);
foreach ($g as $key=>$val){
if(($rand >= $g[$key]['start']) && ($rand < $g[$key]['finish'])){
$arr[] = $key;
$arr2[$key]++;
}
}
}
$A = Array($arr, $arr2);
return $A;
}

Скажите пожалуйста как лучше переделать данную функцию без использования rand ... чтобы погрешнасть была минимальна

   
 
 автор: bronenos   (27.02.2008 в 10:17)   письмо автору
 
   для: sidPR   (27.02.2008 в 09:52)
 

Что именно делает и погрешность чего
Читать чет напряжно =)

   
 
 автор: sidPR   (27.02.2008 в 10:34)   письмо автору
 
   для: bronenos   (27.02.2008 в 10:17)
 

function  distribute_no_rand($arr_1, $k){
         $total = 0; // Длина всего отрезка, составленного из кирпичиков
        $start = 0; // начало кирпичика 
        foreach ($arr_1 as $key =>$val){
            $g[$key]['start'] = $start;
            $g[$key]['finish'] = $start + $val;
            
            $start = $g[$key]['finish'];
            $total = $g[$key]['finish'] -1;
        }    
        print_r($g);
        //echo $total."<br>";
        for($i=0; $i<$k; $i++){
            $rand = rand(0,$total);
            foreach ($g as $key=>$val){
                if(($rand >= $g[$key]['start']) && ($rand < $g[$key]['finish'])){
                    $arr[] = $key;
                    $arr2[$key]++;
                }
            }
        }
        $A = Array($arr, $arr2);
        return $A;



$arr_weight[id] = 100
$arr_weight[id] = 80 и т.д.

$val - кол-во необходимых элементов на выдачу сгенерированных в соответствии с весами..
list($arr,$arr) = distribute($arr_weight, $val);


данный алгоритм может не учесть объекты с малыми весами... тоесть есть вероятность что некоторые объекты не попадут на выдачу вообще.. и ее надо исключить.. подскажите пожалуйста как это сделать ?

   
 
 автор: mihdan   (27.02.2008 в 11:15)   письмо автору
 
   для: sidPR   (27.02.2008 в 10:34)
 

Что вообще должна делать функция и что она делает??? Чтобы подсветить код используйте теги


<? ?>

   
 
 автор: sidPR   (27.02.2008 в 13:00)   письмо автору
 
   для: mihdan   (27.02.2008 в 11:15)
 

есть элементы :
есть общее число которое должно быть на выходе к примеру 100
1=>100
2=>200
3=>90


на выходе должно получится 100 элементов в соответствии с весами 2- элемент будет чаще встречатся , 100 реже , 90 еще реже.. но все они должны встретится...

   
 
 автор: _гость_   (27.02.2008 в 21:40)
 
   для: sidPR   (27.02.2008 в 13:00)
 

похожее на такое должно было получиться ?
<?
$array 
= array(90100200);
$sum $sum20;

function 
nr($array$col)
{
sort($array);
$a = array();
global 
$sum$sum2;

array_walk($arraycreate_function('$v''$GLOBALS["sum"] += $v;'));
$array = array(array(), $array);
for (
$i = (count($array[1]) - 1); $i 0;  $i--)
 {
    
$array[0][$i] = ceil($col/($sum/$array[1][$i]));
 }
array_walk($array[0], create_function('$v''$GLOBALS["sum2"] += $v;'));
 
$array[0][0] = $col $sum2;
// print_r($array);
 
for ($i 0$u 0$i count($array[1]);  $i++)
 {
    
$a array_merge($aarray_fill($u$array[0][$i], $array[1][$i]));
    
$u += $array[0][$i];
 }
 
shuffle($a);
 return 
$a;
}

print_r(nr($array100));

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования