Pagina 1 din 1

Inserare valori in tablou, in mod aleatoriu

Scris: Vin Ian 01, 2016 6:47 pm
de tuxman
La Multi Ani !

Am 10 tablouri goale; vreau sa inserez valori in mod aleatoriu(adica e.g.: tabloul 3, tabloul 5.....), pana cand va exista cel putin un element in fiecare tablou.
Am incercat sa folosesc un tablou multidimensional in care liniile reprezinta tablourile(tabloul 1, tabloul 2,....tabloul 10) , iar coloana reprezinta numarul de elemente.
Dar codul meu nu functioneaza :

Cod: Selectaţi tot

// N = tablouri goale; presupunem N = 10
//  1) se introduc valori aleatoriu pana când în toate tablourile va exista cel putin un element
//  2) se verifica daca primul tabel are 2 elemente
//  3) se afla media numărului de tablouri în care exista 2 elemente

$urna = array (array());

for($i=0; $i<10; $i++) {
 for($j=0; $j<1; $j++) {
  while (count($urna) != 0) {
        $urna[rand(0,$i)][$j] += 1;
        echo "Urna"  . $i . "=" . $urna[$i][$j];
        echo "<br />";
}
}
}


Astept sugestii, cu nerabdare....
Va multumesc !

Re: Inserare valori in tablou, in mod aleatoriu

Scris: Sâm Ian 02, 2016 11:44 pm
de Birkoff
prin tablou cred ca te referi la un array (folositi si voi cuvintele originale nu traduceri din burta)

sa inteleg ca in $urna ai 10 chei fara valori (valorile vrei sa fie introduse aleator, de forma subcheie->valoare, cel putin 1 pe fiecare cheie)
neclaritate:
- valorile din fiecare cheie vrei sa fie numerice? daca da, intre cat si cat (min - max)
- care ar fi algoritmul pentru limitarea numarului de subchei (adica poate fi adaugat minim 1 valoare si maxim 1 milion pentru fiecare cheie?)

poti da un exemplu cum vrei sa arate la final array-ul tau?
exemplu vrei sa arate ceva de gen?

Cod: Selectaţi tot


$urna 
= array(
   0 => array(
      0 => 10,
      1 => 20
   
),
   1 => array (
      0 => 1,
      1 => 2
   
),
   2 => array(
      0 => 33,
      1 => 66
   
)
);

Re: Inserare valori in tablou, in mod aleatoriu

Scris: Dum Ian 03, 2016 2:06 am
de nevvermind
Nici mie nu-mi place "tablou", dar despre ce burta vorbesti? - http://php.net/manual/ro/function.array.php

Re: Inserare valori in tablou, in mod aleatoriu

Scris: Dum Ian 03, 2016 1:53 pm
de tuxman
Multumesc mult pentru raspuns.

valorile din fiecare cheie vrei sa fie numerice? daca da, intre cat si cat (min - max)

Da, valorile sunt numerice; min=1, max=100

care ar fi algoritmul pentru limitarea numarului de subchei (adica poate fi adaugat minim 1 valoare si maxim 1 milion pentru fiecare cheie?)

min=1, max=2 sau nr_subchei >=1 si nr_subchei <=2

Este foarte bun exemplul de output.

Numai bine !

Re: Inserare valori in tablou, in mod aleatoriu  Topic is solved

Scris: Lun Ian 04, 2016 12:26 am
de Birkoff

Cod: Selectaţi tot


<?php
$urna 
= array();
// $i contine cheile primare
for($i=0;$i<=9;$i++) {
   
$urna[$i] = array();
   
// generam random nr de subchei maxime
   
$sub rand(1,9); // daca vrei doar 2 subchei, pui aici 1 direct (numaratoarea incepe de la 0)
   // generam subcheile si valorile random
   
for($s=0;$s<=$sub;$s++) {
      
$urna[$i][$s] = rand(1,100);
   }
}
// afisam rezultatul
echo '<pre>'.var_export($urna,1).'</pre>';
?>


am ales sa generez nr de subchei random (asa intelesesem din ce ai zis tu in primul topic), daca vrei doar 2 subchei citeste comentariile si inlocuiesti $sub = 1;

Cod: Selectaţi tot

<pre>array (
  
=> 
  array (
    
=> 9,
    
=> 73,
    
=> 67,
    
=> 43,
    
=> 52,
    
=> 94,
  ),
  
=> 
  array (
    
=> 3,
    
=> 78,
  ),
  
=> 
  array (
    
=> 95,
    
=> 45,
    
=> 61,
  ),
  
=> 
  array (
    
=> 3,
    
=> 97,
    
=> 47,
    
=> 43,
    
=> 19,
  ),
  
=> 
  array (
    
=> 30,
    
=> 19,
    
=> 26,
  ),
  
=> 
  array (
    
=> 98,
    
=> 48,
    
=> 4,
  ),
  
=> 
  array (
    
=> 5,
    
=> 2,
    
=> 54,
    
=> 13,
    
=> 75,
    
=> 21,
    
=> 55,
    
=> 26,
    
=> 14,
    
=> 59,
  ),
  
=> 
  array (
    
=> 92,
    
=> 77,
    
=> 23,
    
=> 37,
  ),
  
=> 
  array (
    
=> 64,
    
=> 39,
    
=> 33,
    
=> 11,
    
=> 82,
  ),
  
=> 
  array (
    
=> 30,
    
=> 11,
    
=> 71,
    
=> 56,
    
=> 23,
    
=> 68,
  ),
)</
pre>
 

Re: Inserare valori in tablou, in mod aleatoriu

Scris: Vin Ian 08, 2016 12:41 pm
de vectorialpx
tuxman scrie:

Cod: Selectaţi tot

$urna = array (array());
for($i=0; $i<10; $i++) {
  for($j=0; $j<1; $j++) {
    while (count($urna) != 0) {
        $urna[rand(0,$i)][$j] += 1;
        echo "Urna"  . $i . "=" . $urna[$i][$j];
        echo "<br />";
    }
  }
}


Nu stiu daca ti-ai dat seama, dar ai intrat intr-o bucla infinita.
Acel while se va intampla mereu, din prima rulare, pentru ca

Cod: Selectaţi tot

$urna = array (array());

are count = 1 (deja are un element, unul gol, dar are)
while (count($urna) != 0) nu se opreste niciodata

A doua greseala este

Cod: Selectaţi tot

$urna[rand(0,$i)][$j] += 1;

prima data $i = 0; deci vei avea rand(0,0)
=> in primul ciclu de rulare al primului for (unde $i = 0) count($urna) = 1 (tot timpul)
pentru ca ai cheia 0 (zero) care se rescrie => bucla infinita

O mica analiza a codului tau o poti face astfel:

Cod: Selectaţi tot

<?php

$urna = array(array());

// incercam sa facem o contorizare a apelurilor
$counter = 0;

for($i=0; $i<10; $i++) {
   for($j=0; $j<1; $j++) {
      while (count($urna) != 0) {
         
         // un mic debug + oprim executarea dupa 20 de cicluri
         $counter++;
         var_dump($counter, count($urna));
         if ($counter > 20) {
            break;
         }
         
         $urna[rand(0,$i)][$j] += 1;
         echo "Urna"  . $i . "=" . $urna[$i][$j];
         echo "<br />";
      }
   }
}


Concluzie 1: incearca sa eviti WHILE inclus in FOR sau FOR in WHILE. Daca e musai s-o faci, gandeste bine ceea ce faci astfel incat sa eviti o bucla infinita.
Concluzie 2: incearca sa eviti instructiuni repetitive combinate cu random, in special cand e vorba de chei de array care fac parte din conditie.

Incearca sa te exprimi in limba engleza cand folosesti termeni tehnici.
Informatica tradusa in limba romana suna ca dracu'.
Daca te duci intr-o companie cu "tablou" rad si curcile de tine.
Gandeste-te ca va trebui sa traduci "cron" sau "revert" sau "submit" si sunt mii de astfel de exemple. Nu te chinui prea tare.

O alta varianta de cod:

Cod: Selectaţi tot

<?php

// initializare
$urne = [];

// setari
$nrUrne = 10;
$nrMaxValoriInUrne = 2;
$valoareMaximaAdmisa = 100;

// populare cu valori
// asemanator cu un FOR dar scris altfel
$totalUrne = range(1, $nrUrne);
foreach ($totalUrne as $nrUrna) {
   $urne[$nrUrna] = fillWithNumbers($nrMaxValoriInUrne, $valoareMaximaAdmisa);
}

echo '<pre>';
print_r($urne);
echo '</pre>';

function fillWithNumbers($maxCount, $maxVal) {
   $output = [];
   for ($i = 0; $i < rand(1, $maxCount); $i++) {
      $output[] = rand(1, $maxVal);
   }
   return $output;
}