|
|
|
| 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 ... чтобы погрешнасть была минимальна | |
|
|
|
|
|
|
|
для: sidPR
(27.02.2008 в 09:52)
| | Что именно делает и погрешность чего
Читать чет напряжно =) | |
|
|
|
|
|
|
|
для: 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);
|
данный алгоритм может не учесть объекты с малыми весами... тоесть есть вероятность что некоторые объекты не попадут на выдачу вообще.. и ее надо исключить.. подскажите пожалуйста как это сделать ? | |
|
|
|
|
|
|
|
для: sidPR
(27.02.2008 в 10:34)
| | Что вообще должна делать функция и что она делает??? Чтобы подсветить код используйте теги
| |
|
|
|
|
|
|
|
для: 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(90, 100, 200);
$sum = $sum2= 0;
function nr($array, $col)
{
sort($array);
$a = array();
global $sum, $sum2;
array_walk($array, create_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($a, array_fill($u, $array[0][$i], $array[1][$i]));
$u += $array[0][$i];
}
shuffle($a);
return $a;
}
print_r(nr($array, 100));
|
| |
|
|
|