Inserare valori in tablou, in mod aleatoriu Topic is solved

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

tuxman
Junior Member
Mesaje: 31
Membru din: Sâm Noi 07, 2009 6:03 pm
Localitate: Constanta

Inserare valori in tablou, in mod aleatoriu

Mesajde tuxman » Vin Ian 01, 2016 6:47 pm

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 !



Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Re: Inserare valori in tablou, in mod aleatoriu

Mesajde Birkoff » Sâm Ian 02, 2016 11:44 pm

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
   
)
);
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: Inserare valori in tablou, in mod aleatoriu

Mesajde nevvermind » Dum Ian 03, 2016 2:06 am

Nici mie nu-mi place "tablou", dar despre ce burta vorbesti? - http://php.net/manual/ro/function.array.php
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

tuxman
Junior Member
Mesaje: 31
Membru din: Sâm Noi 07, 2009 6:03 pm
Localitate: Constanta

Re: Inserare valori in tablou, in mod aleatoriu

Mesajde tuxman » Dum Ian 03, 2016 1:53 pm

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 !

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

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

Mesajde Birkoff » Lun Ian 04, 2016 12:26 am

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>
 
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4832
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Re: Inserare valori in tablou, in mod aleatoriu

Mesajde vectorialpx » Vin Ian 08, 2016 12:41 pm

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;
}


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 50 vizitatori