Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  PHP- numbri genereerime teatud numbritega. märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele eelmine  1, 2
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 12.06.2009 18:50:17 vasta tsitaadiga

andrusny kirjutas:
See pole ju see mida sooviti, kus kohas siin hoitakse meeles, millised numbrid on genereeritud juba? Vaadatakse seda ainult tsükli jooksul, kuid eelmist tsüklit ei arvestata ju. Või sain ma valesti aru?

usun, et said valesti aru, kood teeb mida kood tegema peab.
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 12.06.2009 18:56:59 vasta tsitaadiga

Proovi siis ise, kood teeb jah seda mida tegema peab, kuid said valesti aru, mida sooviti.
Tee refresh oma browserile ja vaata, kas korduvad samad kombinatsioonid.
Korduvad küll. Kuigi ma ei näe sellel ühekohaliste numbritega mõtet.
tsitaat:
Sellisel juhul ei saaks sa ühekohalisi numbreid rohkem kui kaks korda genereerida, sest nad lõpevad lihtsalt otsa.

Aga kui oleks vaja näiteks numbreid 1-1000 genereerida ja siis, et nad ei korduks kui proge uuesti laadida siis oleks asjal jumet.

Näiteks mingi loterii, et samasid võidu kombinatsioone mitte tekitada.

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 12.06.2009 20:17:12 vasta tsitaadiga

andrusny kirjutas:
Proovi siis ise, kood teeb jah seda mida tegema peab, kuid said valesti aru, mida sooviti.
Tee refresh oma browserile ja vaata, kas korduvad samad kombinatsioonid.
Korduvad küll. Kuigi ma ei näe sellel ühekohaliste numbritega mõtet.
tsitaat:
Sellisel juhul ei saaks sa ühekohalisi numbreid rohkem kui kaks korda genereerida, sest nad lõpevad lihtsalt otsa.

Aga kui oleks vaja näiteks numbreid 1-1000 genereerida ja siis, et nad ei korduks kui proge uuesti laadida siis oleks asjal jumet.

Näiteks mingi loterii, et samasid võidu kombinatsioone mitte tekitada.

ah selles mõttes, siis ma kasutaks andmebaase, et hoida olemasolevaid kombinatsioone seal..

minu viga beer_yum.gif icon_smile.gif
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga

sõnum 14.06.2009 12:56:06 vasta tsitaadiga

mark11 kirjutas:
ah selles mõttes, siis ma kasutaks andmebaase, et hoida olemasolevaid kombinatsioone seal..

Kasutades andmebaasi, kas olemasolevale koodile tuleb palju kirjutamist juurde või piisab paarist koodireast ja voilaa?
Failis hoides genereerituid numbreid on vist lihtsaim viis ja selles suunas ka liikuda.

Jäädes ikkagi ootama seda viimast lihvi beer_yum.gif
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 14.06.2009 16:55:00 vasta tsitaadiga

Kui sul on andmebaasi võimalus olemas ja oled ennem kasutanud võid panna baasi, kui mitte võib sellise lihtsa rakenduse jaoks küll faili kasutada, pole mingit mõtet hakata jebima baasi tegema ja õppima otsima, kuidas see toimib.

Kasuta näiteks sellist salvestust

if(is_file('numbrid.php')){
      $fk=fopen('numbrid.php',"r");
      flock($fk, LOCK_EX);
      $nr=fgets($fk);
      $nrM=unserialize($nr); // olemasolevad numbrid massiivis
      
   }
// *** See osa tuleb koodi lõppu, kui oled sinna masiivi lisanud numbrid, mida kasutasid sellel korral ***
   
   $save=serialize($nrM);
         $fk=fopen('numbrid.php',"w+");
               fputs($fk,$save);
                     fclose($fk);

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga

sõnum 14.06.2009 20:25:36 vasta tsitaadiga

andrusny kirjutas:
Kui sul on andmebaasi võimalus olemas ja oled ennem kasutanud võid panna baasi, kui mitte võib sellise lihtsa rakenduse jaoks küll faili kasutada, pole mingit mõtet hakata jebima baasi tegema ja õppima otsima, kuidas see toimib.

Kasuta näiteks sellist salvestust

if(is_file('numbrid.php')){
      $fk=fopen('numbrid.php',"r");
      flock($fk, LOCK_EX);
      $nr=fgets($fk);
      $nrM=unserialize($nr); // olemasolevad numbrid massiivis
      
   }
// *** See osa tuleb koodi lõppu, kui oled sinna masiivi lisanud numbrid, mida kasutasid sellel korral ***
   
   $save=serialize($nrM);
         $fk=fopen('numbrid.php',"w+");
               fputs($fk,$save);
                     fclose($fk);


Kohutav, proovisin neid kahte koodi omavahel siduda aga ei saanud hakkama. Numbrid.php faili sisse tuleb "b:0;", mida see täpselt tähendab, ei oska öelda. Proovisin ka käsitsi numbreid lisada numbrid.php faili aga paraku ka see variant ei töötanud.

Aluseks võtsin:
php:
  1. <?php
  2. function number_list($numbers)
  3. {
  4.    static $list = array();
  5.    if(count($list) > 0) return $list;
  6.    foreach($numbers as $id => $data)
  7.       $list += array_fill(count($list), $data["percent"], $data["number"]);
  8.    return $list;   
  9. }
  10. function sweet_output($length)
  11. {
  12.    static $numbers = array(
  13.             array("number" => 1, "percent" => 50),
  14.             array("number" => 4, "percent" => 30),
  15.             array("number" => 5, "percent" => 10),
  16.             array("number" => 6, "percent" => 5),
  17.             array("number" => 0, "percent" => 4),
  18.             array("number" => 2, "percent" => 1));
  19.    
  20.    $xlist = number_list($numbers);
  21.    shuffle($xlist);
  22.    
  23.    // Generate random sequence
  24.    $max_elements = count($xlist);
  25.    $r_sequence = array();
  26.    $counter = 0;
  27.    while($counter++ < $length && $counter < $max_elements)
  28.    {
  29.       $temp_ = $xlist[$counter];   
  30.       if(in_array($temp_, $r_sequence)) $length++;
  31.       else $r_sequence[] = $temp_;
  32.    }
  33.    
  34.    return implode($r_sequence, ",");
  35. }
  36.  
  37. $list = array();
  38. // Generate 3 pair of numbers and make sure they are not same
  39. $pairs = 0;
  40. while($pairs < 3)
  41. {
  42.    if(!in_array(($temp = sweet_output(3)), $list))
  43.    {
  44.       echo "Pair number {$pair} with content: {$temp} <br>";
  45.       $list[] = $temp;
  46.       $pairs++;
  47.    }
  48. }
  49. ?>
  50.  
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004



Online

sõnum 14.06.2009 20:38:49 vasta tsitaadiga

tulema, see "b:0;" on serialiseeritud kujul massiiv või muu elukas, mida saab salvestada faili tekstikujul, et hiljem see sealt kergelt uuesti tagasi vanasse vormi tõmmata.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 15.06.2009 00:01:36 vasta tsitaadiga

Nüüd seda $list salvesta ja hiljem loe sisse, kuid nagu isegi näed juba kolmel korral, mis sa tsüklisse panid hakkavad numbrid otsa lõppema.
Nüüd all näed $save kuva milliselt sul numbrid faili salvestatakse, salvestad selle. Kui loed sisse selle uuesti ja teed unserialize() saad täpselt sama massiivi, nagu $list ennem oli.

<?php
function number_list($numbers)
{
   static $list = array();
   if(count($list) > 0) return $list;
   foreach($numbers as $id => $data)
      $list += array_fill(count($list), $data["percent"], $data["number"]);
   return $list;   
}
function sweet_output($length)
{
   static $numbers = array(
            array("number" => 1, "percent" => 50),
            array("number" => 4, "percent" => 30),
            array("number" => 5, "percent" => 10),
            array("number" => 6, "percent" => 5),
            array("number" => 0, "percent" => 4),
            array("number" => 2, "percent" => 1));
   
   $xlist = number_list($numbers);
   shuffle($xlist);
   
   // Generate random sequence
   $max_elements = count($xlist);
   $r_sequence = array();
   $counter = 0;
   while($counter++ < $length && $counter < $max_elements)
   {
      $temp_ = $xlist[$counter];   
      if(in_array($temp_, $r_sequence)) $length++;
      else $r_sequence[] = $temp_;
   }
   
   return $r_sequence;
}
$tyhi=array();
$list = array();
// Generate 3 pair of numbers and make sure they are not same
$pairs = 0;
while($pairs < 3)
{
$temp = sweet_output(4);
for($i=0;$i<count($temp);$i++){

   if(!in_array(($temp[$i]), $list))
   {
   $out[]=$temp[$i];
   $vahe[]=$temp[$i];
   }
      }
   
     $out2=implode($out,",");
      $out= $tyhi;
    
      echo "Pair number {$pairs} with content: {$out2} <br>";
     $list = array_merge($list,$vahe) ;
      $pairs++;
   }

echo "<br><br>";
var_dump($list);

$save=serialize($list);
echo "<br><br>".$save;
?>

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga

sõnum 15.06.2009 19:00:32 vasta tsitaadiga

uhh! Ma ei saanudki nüüd täpselt aru, mida selle lausega öelda on tahetud: "Nüüd all näed $save kuva milliselt sul numbrid faili salvestatakse". Koodis ma ei näe ühtegi faililaiendit (.txt|.php) kuhu ta võiks need numbrid salvestada. Kas ma olen äkki millestki valesti aru saanud?

Koodist ja tulemusest endast. Kui on soov kaks numbrid genereerida, siis genereerib ühe tulemuse.
Pair number 0 with content: 4,1,0,5
Pair number 1 with content: 6

Ka sellist loetakse korduseks, kui tulemuses on näiteks 1, 2, 3 ja peale lehelaadimist tuleb 1, 3, 2. See tähendaks siis seda, et arvud peaksid tulema tulemuses kronoloogilises järjekorras, mis tooks kaasa veel pikema koodi thumbs_down.gif
Kas tõesti ei ole mingisugust lihtsat lahendust, kus genereeritud numbrid paneb otse .txt faili ja rohkem neid numbreid tulemuses ei kuva, kasvõi käsitsi lisades?

icon_confused.gif
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 15.06.2009 19:47:09 vasta tsitaadiga

tsitaat:
Koodis ma ei näe ühtegi faililaiendit (.txt|.php) kuhu ta võiks need numbrid salvestada.


Eeldasin, et teed koodi ise. Ma andsin ainult suuna.
Proovi seda.
See salvestab kõik kasutatud numbrid faili ja ei lase neil korduda järgmisel refreshil. Kasutatud numbreid kuvatakse ka kõige lõpus.

<?php
if(is_file('numbrid.php')){
      $fk=fopen('numbrid.php',"r");
      flock($fk, LOCK_EX);
      $nr=fgets($fk);
      $list=unserialize($nr); // olemasolevad numbrid massiivis
       
   } else {$list = array();}

      
               
function number_list($numbers)
{
   static $list = array();
   if(count($list) > 0) return $list;
   foreach($numbers as $id => $data)
      $list += array_fill(count($list), $data["percent"], $data["number"]);
   return $list;   
}
function sweet_output($length)
{
   static $numbers = array(
            array("number" => 1, "percent" => 50),
            array("number" => 4, "percent" => 30),
            array("number" => 5, "percent" => 10),
            array("number" => 6, "percent" => 5),
            array("number" => 0, "percent" => 4),
            array("number" => 2, "percent" => 1));
   
   $xlist = number_list($numbers);
   shuffle($xlist);
   
   // Generate random sequence
   $max_elements = count($xlist);
   $r_sequence = array();
   $counter = 0;
   while($counter++ < $length && $counter < $max_elements)
   {
      $temp_ = $xlist[$counter];   
      if(in_array($temp_, $r_sequence)) $length++;
      else $r_sequence[] = $temp_;
   }
   
   return $r_sequence;
}
$tyhi=array();
$out = array();

// Generate 3 pair of numbers and make sure they are not same
$pairs = 0;
while($pairs < 3)
{
$temp = sweet_output(4);
for($i=0;$i<count($temp);$i++){

   if(!in_array(($temp[$i]), $list))
   {
   $out[]=$temp[$i];
   $list[]=$temp[$i];
   }
      }
   
    $out2=implode($out,",");
      $out= $tyhi;
    
      echo "Pair number {$pairs} with content: {$out2} <br>";
 
      $pairs++;
   }

   // *** See osa tuleb koodi lõppu, kui oled sinna masiivi lisanud numbrid, mida kasutasid sellel korral ***
   
   $save=serialize($list);
         $fk=fopen('numbrid.php',"w+");
               fputs($fk,$save);
                     fclose($fk);
               
echo "<br><br>Siin on numbrid, mis on juba kasutatud<br><br>";
for($i=0;$i<count($list);$i++){
echo "Number ".($i+1)." on - ".$list[$i]."<br>";
}
?>

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga

sõnum 15.06.2009 20:58:30 vasta tsitaadiga

andrusny
Ei ole ikka see, mida sooviksin. Teen väikese näitliku versiooni.

On olemas puhas genereerimise script, mis genereerib numbreid browseril. AMD poolt kirjutatud script,
php:
  1. <?php
  2. function rndnumbers($array) {
  3.    $ret = array();
  4.    $i = 0;
  5.    foreach($array as $val) {
  6.       $ret += array_fill($i, $val[1], $val[0]);
  7.       $i += $val[1];
  8.    }
  9.    return $ret;
  10. }
  11. function rnd($mitu_arvu = 1) {
  12.    $tulemus = array();
  13.    $arvud = array(
  14.             array(1, 5),
  15.             array(2, 20),
  16.             array(3, 30),
  17.             array(4, 25),
  18.             array(5, 30),
  19.             array(6, 10),
  20.             array(7, 50),
  21.             array(8, 60),
  22.             array(9, 70),
  23.             array(10, 80));           
  24.            
  25.    $arvud = rndnumbers($arvud);
  26.    
  27.    $tmp = array();
  28.    $i = $mitu_arvu;
  29.    while(count($arvud) > 0 && $i-- > 0) {
  30.       $id = array_rand($arvud);
  31.       if(in_array($arvud[$id], $tmp)) {
  32.          $i++;
  33.          unset($arvud[$id]);
  34.          continue;
  35.       }
  36.       $tmp[] = $arvud[$id];
  37.       unset($arvud[$id]);
  38.    }
  39.    while(count($tmp) > 0 && $mitu_arvu-- > 0) {
  40.       $id = array_rand($tmp);
  41.       if(count($tulemus) == 0 && $tmp[$id] == 0) {
  42.          $mitu_arvu++;
  43.          continue;
  44.       }
  45.       $tulemus[] = $tmp[$id];
  46.       unset($tmp[$id]);
  47.    }
  48.    return $tulemus;
  49. }
  50. for ($i = 0; $i < 3; $i++) {
  51.   echo implode(" ", rnd(5))."<br>";
  52. }
  53. ?>

Genereeritud numbrid:
1 3 7 8 10
4 7 8 9 10
3 4 5 9 10

Genereerimise scriptile tule juurde kirjutada lisa kood/script, mille ülesanne on kontrollida kordus numbreid.
Nüüd on need numbrid korra juba ekraanilt läbi käinud, läheb automaatselt .txt| .php faili. Numbrid, mis on juba failis, seda kontrollib lisa script, kas antud numbrikombinatsioon on ekraanil olnud või mitte.

Olemasoleva faili sisu:
1 3 7 8 10
4 7 8 9 10
3 4 5 9 10

andrusny: Mingil põhjusel said arvud otsa antud scriptis, kuid numbrikombinatsioone on miljoneid. icon_rolleyes.gif

Ma ei tea, kas me mõistame nüüd üksteist icon_smile.gif
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 15.06.2009 21:47:56 vasta tsitaadiga

Sa ei tekita numbrikombinatsioone vaid kontrollid üksikuid numbreid. Seetõttu ka lõppeb see. Sa pead kontrollima siis seda neljakohalist numbrit ja seda salvestama, kuid sinu näidetes ta annab need numbrid ühekohalisena ja paneb neid lihtsalt neli tükki kõrvuti ja sellest siis ka viga. Lõpevad ühekohalised numbrid ja ongi otsas.

********************************

Tegin nüüd sellise, mis väljastab neljakohalisi ja need ei tohiks nüüd korduda.

<?php
global $list;
if(is_file('numbrid.php')){
      $fk=fopen('numbrid.php',"r");
      flock($fk, LOCK_EX);
      $nr=fgets($fk);
      $list=unserialize($nr); // olemasolevad numbrid massiivis
       
   } else {$list = array();}

      
               
function number_list($numbers)
{
   static $list = array();
   if(count($list) > 0) return $list;
   foreach($numbers as $id => $data)
      $list += array_fill(count($list), $data["percent"], $data["number"]);
   return $list;   
}
function sweet_output($length)
{
   static $numbers = array(
            array("number" => 1, "percent" => 50),
            array("number" => 4, "percent" => 30),
            array("number" => 5, "percent" => 10),
            array("number" => 6, "percent" => 5),
            array("number" => 0, "percent" => 4),
            array("number" => 2, "percent" => 1));
   
   $xlist = number_list($numbers);
   shuffle($xlist);
   
   // Generate random sequence
   $max_elements = count($xlist);
   $r_sequence = array();
   $counter = 0;
   while($counter++ < $length && $counter < $max_elements)
   {
      $temp_ = $xlist[$counter];   
      if(in_array($temp_, $r_sequence)) $length++;
      else $r_sequence[] = $temp_;
   }
   
   return $r_sequence;
}
//*****************************************************************
function kontroll(){
global $out;
global $list;
//                           !in_array($out2), $list)

$temp = sweet_output(4);
$out2=implode($temp,"");


   if( !in_array(($out2), $list))
{
  $out=$out2;
$list[]=$out2;
  } else
  { kontroll();}
   
    }
    //*************************************************************

$tyhi="";
//$out = array();
//$list = array();
// Generate 3 pair of numbers and make sure they are not same
$pairs = 0;
while($pairs < 3)
{

   
kontroll();
      echo "Pair number {$pairs} with content: {$out} <br>";
  //   $list = array_merge($list,$vahe) ;
      $pairs++;
       $out= $tyhi;
   }

   // *** See osa tuleb koodi lõppu, kui oled sinna masiivi lisanud numbrid, mida kasutasid sellel korral ***
   
   $save=serialize($list);
         $fk=fopen('numbrid.php',"w+");
               fputs($fk,$save);
                     fclose($fk);
               
echo "<br><br>Siin on numbrid, mis on juba kasutatud<br><br>";
for($i=0;$i<count($list);$i++){
echo "Number ".($i+1)." on - ".$list[$i]."<br>";
}
?>

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga

sõnum 16.06.2009 23:46:48 vasta tsitaadiga

andrusny thumbs_up.gif : Sinu viimane jõupingutus viis asja lõpp-punkti. Kõik töötab perfektselt nii nagu algselt soovisin. Suuremad tänud andrusny ja muidugi teistele ka, kes kaasa aitasid ja mõtisklesid.

thumbs_up.gif
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  PHP- numbri genereerime teatud numbritega. mine lehele eelmine  1, 2
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.