[ CoaPsyFactor @ 29.06.2015. 11:37 ] @
Pozdrav dragi es clanovi :)

Dakle imam jedan zadatak, a to je da napunim niz sa N clanova koji sadrze random broj od MIN do MAX, ali da prosek tog niza (kad se sve sabere i podeli za duzinom) bude odredjena cifra, npr 2.3

Dakle skripta dobija sledece parametre $min = 0, $max = 50, $length = 100, $average = 2.3;

pa bi mi dobro dosla bilo kakva pomoc posto sam zapeo u jednom delu. :)

Hvala.
[ svepomalo @ 29.06.2015. 11:43 ] @
a kako mi da znamo u kom delu si zapeo ako ne pokazes f-ju? :)
[ CoaPsyFactor @ 29.06.2015. 11:58 ] @
Code:

    function getRandomArray($min, $max, $count, $average)
    {
        $array = array();
        $sum = 0;

        for ($i = 0; $i < $count; $i++) {
            $n = mt_rand($min, $max);
            $sum += $n;
            $array[] = $n;
        }

        $currentAvg = $sum / $count;

        if ($currentAvg == $average) {
            return $array;
        }

        $diff = $currentAvg / $average;
        $sum = 0;
        $mul = 1;

        foreach ($array as $key => $value) {
            $smul = $mul;

            while ($mul) {
                $newVal = $value / ($diff * $mul);
                echo "{$newVal} \n";

                if ($newVal >= $min) {
                    $array[$key] = $newVal;
                    $sum += $newVal;

                    break;
                } else if (false == $mul - 1) {
                    $mul = $smul + 1;
                    echo "Next array element\n";
                    break;
                }

                $mul--;
            }
        }

        return $array;
    }


ali ovo ne radi xD , mozda sam ja imao pogresnu zamisao kako ovo da uradim - tako da je bilo kakva pomoc dobro dosla :D
[ deZio @ 29.06.2015. 12:57 ] @
Zadatak nema smisla, ili ti nisi dobro objasnio.

Da li u tvom primeru dužina niza mora biti 100? Ako da, onda ne vidim svrhu koristiti random za članove niza. Pošto postoji mogućnost da pre skripta pukne nego da se od 100 elemenata potrefi baš 2.3 kao prosečan broj.

Dakle jako je mala verovatnoća da ćeš potrefiti srednju vrednost 2.3 ako je svaki član niza vrednost 0-50, i to sa 100 članova.

Kada bismo znali koja je svrha zadatka, možda bismo i mogli bolje pomoći.
[ CoaPsyFactor @ 29.06.2015. 13:18 ] @
nije mi tacno receno koja je svrha zadatka, samo mi je receno da trebam da izgenerisem niz od N brojeva (float, int) ciji je prosek na kraju zadata vrednos, primer 2.3
[ djoka_l @ 29.06.2015. 14:20 ] @
Da li razumeš da zadatak, ovako kako si ga postavio, nema smisla?

Ako generišeš slučajne brojeve sa UNIFORMNOM raspodelom u opsegu 0-50, tada će ti srednja vrednost biti oko 25.
Da bi dobio srednju vrednost 2.3, treba da generišeš ili slučajne brojeve sa uniformnom raspodelom u opsegu 0-4.6 ili da napraviš generator sa NEUNIFORMNOM raspodelom slučajnih brojeva (recimo sa normalnom ili nekom drugom).
[ CoaPsyFactor @ 29.06.2015. 15:19 ] @
Trebam da generisem random niz sa 100 clanova, ciji prosek zbira svih clanova na kraju je neka cifra.

Primer:

/** Jedan clan moze biti izmedju 0 i 50 */
$min = 0;
$max = 50;

/** Broj clanova koje moram da imam */
$lenght = 100;

/** Prosecna vrednost koju na kraju moram da dobijem */
$average = 20.3;

tako da na kraju kada saberem sve clanove niza i podelim ih sa $count dobijem $average, a pri tome da ni jedan clan ne sme da ispadne iz opsega 0-50
[ deZio @ 29.06.2015. 15:49 ] @
Evo neko osnovno rešenje koje nije idealno ali radi posao. Probaj da ga prilagodiš ako je potrebno:

Code (php):

     
     function getRandomArray( $min, $max, $count, $average ){
         
          // KREIRAJ NIZ SA $count DUZINOM
          $result_array = array_fill( 0, $count, 0 );
         
          // KREIRAJ FUNKCIJU KOJA VRACA NASUMICAN DECIMALAN BROJ
          $random_float_callback = function() use( $min, $max ){ return round( mt_rand( $min, $max ) + 1 / mt_rand( 1, 10 ), 1 ); };
         
          // POPUNI POSTOJECI NIZ SA NASUMICNIM BROJEVIMA
          $result_array = array_map( $random_float_callback, $result_array );
         
          // ZBIR VREDNOSTI ELEMENATA NIZA
          $result_sum = array_sum( $result_array );
         
          // ZBIR VREDNOSTI ELEMENATA NIZA KOJI NAM TREBA
          $target_sum = round( $average * $count, 1 );
         
          // SMANJUJ NASUMIČNO ELEMENTE NIZA ZA 0.1, SVE DOK NE DOBIJEMO TRAŽENI ZBIR
          while( $target_sum < $result_sum ){
               
               $rand_array_index = mt_rand( 0, $count - 1 );
               
               // SMANJUJ SAMO VREDNOSTI KOJI SE MOGU SMANJIVATI - DA NE DOBIJEMO NULU ZA NOVU VREDNOST AKO JE PRETHODNA VREDNOST 0.1
               if( $result_array[ $rand_array_index ] > 0.1 ){
                   
                    // SMANJI NASUMICNU VREDNOST NIZA ZA 0.1
                    $result_array[ $rand_array_index ] = round( $result_array[ $rand_array_index ] - 0.1, 1 );
                   
                    // SMANJI ZBIR VREDNOSTI ELEMENATA NIZA ZA 0.1 JER SMO UPRAVO JEDAN ELEMENT NIZA SMANJILI ZA 0.1
                    $result_sum = round( $result_sum - 0.1, 1 );
                   
               }
               
          }
         
          echo '<pre>' . print_r( $result_array, true ) . '</pre>';
         
          echo 'Result: ' . $result_sum;
         
     }
     
     getRandomArray( 0, 50, 100, 2.8 );
     
 


Trebalo bi da dobiješ ovako nešto kao rezultat:

Code:
Array
(
    [0] => 4.2
    [1] => 8.2
    [2] => 0.1
    [3] => 0.1
    [4] => 11.9
    [5] => 7.1
    [6] => 0.1
    [7] => 1.9
    [8] => 0.1
    [9] => 0.1
    [10] => 0.1
    [11] => 0.1
    [12] => 0.1
    [13] => 0.1
    [14] => 0.1
    [15] => 0.1
    [16] => 3
    [17] => 0.1
    [18] => 0.1
    [19] => 0.1
    [20] => 0.1
    [21] => 13.7
    [22] => 10
    [23] => 0.1
    [24] => 0.1
    [25] => 4.2
    [26] => 0.1
    [27] => 0.1
    [28] => 0.1
    [29] => 0.1
    [30] => 0.1
    [31] => 0.1
    [32] => 0.1
    [33] => 15.2
    [34] => 0.1
    [35] => 0.1
    [36] => 19.8
    [37] => 0.1
    [38] => 0.1
    [39] => 0.1
    [40] => 0.1
    [41] => 0.1
    [42] => 0.1
    [43] => 0.1
    [44] => 5
    [45] => 0.1
    [46] => 0.1
    [47] => 4.4
    [48] => 0.1
    [49] => 0.1
    [50] => 11
    [51] => 10
    [52] => 6.6
    [53] => 0.1
    [54] => 0.1
    [55] => 0.1
    [56] => 8.8
    [57] => 0.1
    [58] => 0.1
    [59] => 14.9
    [60] => 0.1
    [61] => 0.1
    [62] => 3.1
    [63] => 0.1
    [64] => 15.4
    [65] => 0.1
    [66] => 0.1
    [67] => 0.1
    [68] => 0.1
    [69] => 0.1
    [70] => 0.1
    [71] => 0.1
    [72] => 0.1
    [73] => 0.1
    [74] => 0.1
    [75] => 15.7
    [76] => 16.7
    [77] => 7.7
    [78] => 0.1
    [79] => 0.1
    [80] => 2.3
    [81] => 3.4
    [82] => 12.5
    [83] => 0.1
    [84] => 0.1
    [85] => 0.1
    [86] => 6.9
    [87] => 0.1
    [88] => 12.9
    [89] => 9
    [90] => 0.1
    [91] => 0.1
    [92] => 0.1
    [93] => 0.1
    [94] => 0.1
    [95] => 7.5
    [96] => 0.1
    [97] => 0.1
    [98] => 0.1
    [99] => 0.1
)
Result: 280
[ CoaPsyFactor @ 29.06.2015. 17:41 ] @
Hvala :)