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
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:  
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 19.01.2008 13:51:23 PHP- numbri genereerime teatud numbritega. vasta tsitaadiga

Internetis on olemas õpetused, kui teha "Random Number Generator" aga see ei sobi.

Soov on ise lisada teatuid numbreid, mis numbrite põhjal ta genereerima hakkab.
Näide: 1–2-3-7 ja antud numbrite alusel hakkab väljastama neid numbreid, mis on ette antud.
Keerulisemaks teeb asjaolu see, et tulemusel peab olema mitu numbrit ja ei tohi korduda. Genereeritud tulemuslehel näiteks: 2 3 7 | Refresh 2 1 7

Kas siin peab kasutama array funktsiooni?

Google on minu parim sõber aga ühtegi õpetust ma ei leidnud.

Aitäh
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 19.01.2008 15:13:35 vasta tsitaadiga

aga palun:

php:
  1. <?php
  2.  
  3. ### Random number generator with special specs
  4. ### Author: mikk36
  5.  
  6. function random_number($count)
  7. {
  8.         $result = rand(0, $count - 1);
  9.         return $result;
  10. }
  11.  
  12. $random_number_array = array(
  13.         1,
  14.         3,
  15.         5,
  16.         7,
  17.         9
  18.         );
  19.  
  20. $random_numbers_count = count($random_number_array);
  21. $random_number_length = 3;
  22.  
  23. $random_number_element = random_number($random_numbers_count);
  24. $random_number_existing_elements[] = $random_number_element;
  25. $random_number_result[] = $random_number_array[$random_number_element];
  26.  
  27. for($i = 0; $i < $random_number_length - 1; $i++)
  28. {
  29.         while (true)
  30.         {
  31.                 $random_number_element = random_number($random_numbers_count);
  32.                 if (!in_array($random_number_element, $random_number_existing_elements))
  33.                 {
  34.                         break;
  35.                 }
  36.         }
  37.         $random_number_existing_elements[] = $random_number_element;
  38.         $random_number_result[] = $random_number_array[$random_number_element];
  39. }
  40.  
  41. echo implode("", $random_number_result);
  42.  
  43. ?>
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
AMD
HV veteran
AMD

liitunud: 29.07.2003




sõnum 19.01.2008 15:47:18 vasta tsitaadiga

function rnd($mitu_arvu = 1) {
  $tulemus = "";
  $arvud = array(1, 4, 5, 6, 0);
  while(count($arvud) > 0 && $mitu_arvu-- > 0) {
    $id = array_rand($arvud);
    // kontrollime, et esimene arv ei oleks 0
    if($tulemus == "" && $arvud[$id] == 0) {
      $mitu_arvu++;
      continue;
    }
    $tulemus .= $arvud[$id];
    unset($arvud[$id]);
  }
  return $tulemus;
}

_________________
From now on, the forum is owned by AMD.That means that you are NO LONGER allowed to talk about, or even mention *ntel.
Kommentaarid: 335 loe/lisa Kasutajad arvavad:  :: 145 :: 3 :: 12
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 19.01.2008 15:56:55 vasta tsitaadiga

Hea script aga soov oleks nii, et "number tühik number" ehk 2 4 8 ja ridade arvu saab muuta üksteise alla.

Näide:
9 12 28 55
2 56 24 53
23 6 55 47


Tänud igatahes!
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 19.01.2008 16:04:32 vasta tsitaadiga

tulema kirjutas:
Hea script aga soov oleks nii, et "number tühik number" ehk 2 4 8 ja ridade arvu saab muuta üksteise alla.

Näide:
9 12 28 55
2 56 24 53
23 6 55 47


Tänud igatahes!
no see on ju vaid väljundi muutmine, tee ümber
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
AMD
HV veteran
AMD

liitunud: 29.07.2003




sõnum 19.01.2008 16:04:37 vasta tsitaadiga

Mis see on mingi kooliülesanne nüüd või? icon_confused.gif
_________________
From now on, the forum is owned by AMD.That means that you are NO LONGER allowed to talk about, or even mention *ntel.
Kommentaarid: 335 loe/lisa Kasutajad arvavad:  :: 145 :: 3 :: 12
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 19.01.2008 17:00:52 vasta tsitaadiga

AMD kirjutas:
Mis see on mingi kooliülesanne nüüd või? icon_confused.gif


Tööinimene juba ja mitte programmeerimise vallas icon_smile.gif

Kui see oleks kooliülesanne, siis ma ei tuleks siia tervet koodi küsima vaid üritaksin juba ise valmis teha ja errori puhul oleksin üles riputanud vigase koodijupi.
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 19.01.2008 19:12:55 vasta tsitaadiga

AMD kirjutas:
function rnd($mitu_arvu = 1) {
  $tulemus = "";
  $arvud = array(1, 4, 5, 6, 0);
  while(count($arvud) > 0 && $mitu_arvu-- > 0) {
    $id = array_rand($arvud);
    // kontrollime, et esimene arv ei oleks 0
    if($tulemus == "" && $arvud[$id] == 0) {
      $mitu_arvu++;
      continue;
    }
    $tulemus [] = $arvud[$id];
    unset($arvud[$id]);
  }
  return $tulemus;
}

muutsin tibakese su koodi, AMD

kutsud funktsiooni välja ja saad vastu siis array's need väärtused
et saada selles sinu soovitud vormingus, siis: echo implode(" ", rnd());
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 20.01.2008 12:57:01 vasta tsitaadiga

Kurb küll aga jõhvikas ei võta välja seda PHP keelt ja oma soovitud tulemust ma ei saanud.

Vanasti tehti kõik manuaalselt, kasutan seda varianti.
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 20.01.2008 13:19:41 vasta tsitaadiga

tulema kirjutas:
Kurb küll aga jõhvikas ei võta välja seda PHP keelt ja oma soovitud tulemust ma ei saanud.

Vanasti tehti kõik manuaalselt, kasutan seda varianti.
sa kohe üldse ei oska php keelt või ?
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 20.01.2008 14:12:09 vasta tsitaadiga

Excelis ma tunnen end kindlamalt, kui PHP's. Excelis ma teeksin valmis ka selle genereerimise aga seda ma ei saa kasutada veebis.
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 20.01.2008 14:23:32 vasta tsitaadiga

<?php
function rnd($mitu_arvu = 1) {
  $tulemus = "";
  $arvud = array(1, 4, 5, 6, 0);
  while(count($arvud) > 0 && $mitu_arvu-- > 0) {
    $id = array_rand($arvud);
    // kontrollime, et esimene arv ei oleks 0
    if($tulemus == "" && $arvud[$id] == 0) {
      $mitu_arvu++;
      continue;
    }
    $tulemus [] = $arvud[$id];
    unset($arvud[$id]);
  }
  return $tulemus;
}
echo implode(" ", rnd(5));
?>
näeh, täispikk toimiv kood
rnd() sees olev 5 tähendab seda et mitmest arvust see suvanumber koosnema peab ja $arvud sisse sisestad siis valimiku
kui tahad mitu korda seda koodi, siis pane selle viimase rea asemele:
for ($i = 0; $i < 3; $i++) {
  echo implode(" ", rnd(5))."<br>";
}
3 on seal siis see mitu korda sa seda kätte tahad saada

saadud kood ei vasta ühestki otsast standarditele ja seetõttu on soovitav ise midagi tarka sinna ümber teha (html'i) kui on soov seda paremini väljastada
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 20.01.2008 15:43:10 vasta tsitaadiga

mikk36: Tänud mees!

Mida rohkem ma selle scripti peale mõtlen, seda rohkem mõtteid tuleb.
Näide:
$arvud = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Kas on võimalik sisse tuua tõenäosuse protsenti ehk arv 6 on 80% tõenäosusega tulemuses sees?

Kui scripti peab täielikult ümber tegema, siis las jääb nii nagu on.
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 20.01.2008 18:10:31 vasta tsitaadiga

see teeks väga keerukaks ikka selle, pole mõtet
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 20.01.2008 18:15:09 vasta tsitaadiga

Selge.

Aitäh
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003



Autoriseeritud ID-kaardiga
sõnum 21.01.2008 10:13:33 vasta tsitaadiga

iseenesest, hommikul lugesin, tekkis huvi, duši all tuli idee, õhtul peale tööd ehk löön oma php'lt roostekorra maha ja katsun ära ka teha icon_smile.gif
_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
AMD
HV veteran
AMD

liitunud: 29.07.2003




sõnum 21.01.2008 13:16:24 vasta tsitaadiga

<?php
function rndnumbers($array) {
   $ret = array();
   $i = 0;
   foreach($array as $val) {
      $ret += array_fill($i, $val[1], $val[0]);
      $i += $val[1];
   }
   return $ret;
}
function rnd($mitu_arvu = 1) {
   $tulemus = array();
   $arvud = array(
            array(1, 50),// arv, protsent
            array(4, 30),// arv, protsent
            array(5, 10),//...
            array(6, 5),
            array(0, 4),
            array(2, 1));
   $arvud = rndnumbers($arvud);
   
   // valime välja arvud, millest lõpptulemus tehakse
   $tmp = array();
   $i = $mitu_arvu;
   while(count($arvud) > 0 && $i-- > 0) {
      $id = array_rand($arvud);
      // kontrollime, et ühte arvu ei oleks mitu korda
      if(in_array($arvud[$id], $tmp)) {
         $i++;
         unset($arvud[$id]);
         continue;
      }
      $tmp[] = $arvud[$id];
      unset($arvud[$id]);
   }
   while(count($tmp) > 0 && $mitu_arvu-- > 0) {
      $id = array_rand($tmp);
      // kontrollime, et esimene arv ei oleks 0
      if(count($tulemus) == 0 && $tmp[$id] == 0) {
         $mitu_arvu++;
         continue;
      }
      $tulemus[] = $tmp[$id];
      unset($tmp[$id]);
   }
   return $tulemus;
}
echo implode(" ", rnd(5));
?>
icon_rolleyes.gif
_________________
From now on, the forum is owned by AMD.That means that you are NO LONGER allowed to talk about, or even mention *ntel.
Kommentaarid: 335 loe/lisa Kasutajad arvavad:  :: 145 :: 3 :: 12
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 21.01.2008 18:20:58 vasta tsitaadiga

AMD: Kood töötab laitmatult. Ole Sa tänatud, aitäh.
Fukiku: Tänud ka Sulle.
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 21.01.2008 23:59:47 vasta tsitaadiga

AMD, sa teenid raha php progemisega et see nii ilusasti välja tuleb sul ?
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
AMD
HV veteran
AMD

liitunud: 29.07.2003




sõnum 22.01.2008 11:31:46 vasta tsitaadiga

mikk36, ei, kuigi võiks vist icon_rolleyes.gif
_________________
From now on, the forum is owned by AMD.That means that you are NO LONGER allowed to talk about, or even mention *ntel.
Kommentaarid: 335 loe/lisa Kasutajad arvavad:  :: 145 :: 3 :: 12
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003



Autoriseeritud ID-kaardiga
sõnum 22.01.2008 13:52:47 vasta tsitaadiga

ohjah, mida rohkem ma sellele värgile siin otsa vaatan, seda enam tundub mulle, et php's ma poleks seda küll lahendada osanud icon_smile.gif liiga vähe ja liiga ammu on selle keelega tegeletud..
_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
tulema
HV kasutaja

liitunud: 23.04.2003



Autoriseeritud ID-kaardiga
sõnum 11.06.2009 21:43:45 vasta tsitaadiga

icon_smile.gif

Võtame aluseks AMD koodi:
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, 50),// arv, protsent
  15.             array(4, 30),// arv, protsent
  16.             array(5, 10),//...
  17.             array(6, 5),
  18.             array(0, 4),
  19.             array(2, 1));
  20.    $arvud = rndnumbers($arvud);
  21.    
  22.    // valime välja arvud, millest lõpptulemus tehakse
  23.    $tmp = array();
  24.    $i = $mitu_arvu;
  25.    while(count($arvud) > 0 && $i-- > 0) {
  26.       $id = array_rand($arvud);
  27.       // kontrollime, et ühte arvu ei oleks mitu korda
  28.       if(in_array($arvud[$id], $tmp)) {
  29.          $i++;
  30.          unset($arvud[$id]);
  31.          continue;
  32.       }
  33.       $tmp[] = $arvud[$id];
  34.       unset($arvud[$id]);
  35.    }
  36.    while(count($tmp) > 0 && $mitu_arvu-- > 0) {
  37.       $id = array_rand($tmp);
  38.       // kontrollime, et esimene arv ei oleks 0
  39.       if(count($tulemus) == 0 && $tmp[$id] == 0) {
  40.          $mitu_arvu++;
  41.          continue;
  42.       }
  43.       $tulemus[] = $tmp[$id];
  44.       unset($tmp[$id]);
  45.    }
  46.    return $tulemus;
  47. }
  48. echo implode(" ", rnd(5));
  49. ?>


Antud script genereerib mitu korda ühte tulemust. Kas on võimalik mingisugust kontrolli luua, et ei väljastaks mitu korda. Näiteks luua fail, kus hoitakse genereerituid numbreid failina. Failis olevad numbrid tulemuses enam ei kordu. Mis puutub minu PHP keeleoskusele, siis minupoolt jääb see teostamata, seega jääb teie abi peale lootma beer_yum.gif

Näide:
1 2 3 4 5
1 3 4 5 6
1 2 3 4 5
Kommentaarid: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 11.06.2009 22:00:45 vasta tsitaadiga

Sellisel juhul ei saaks sa ühekohalisi numbreid rohkem kui kaks korda genereerida, sest nad lõpevad lihtsalt otsa. Muidu jah võid hoida kontroll arve failis, mida täiendad igal ringil. Seal on see kontroll funktsioon olemas ka. Tehakse tühi massiiv $tmp = array(); ja hakatakse sinna väljundit koguma kontrollides, et seal juba sarnast pole. Pead ainult selle massiivi ennem failist eelmisekorra arvudega täitma ja ongi ok.
_________________
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 10:09:51 vasta tsitaadiga

mõtlesin, et proovin miskit.

<?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 implode($r_sequence, ",");
}

$list = array();
// Generate 3 pair of numbers and make sure they are not same
$pairs = 0;
while($pairs < 3)
{
   if(!in_array(($temp = sweet_output(3)), $list))
   {
      echo "Pair number {$pair} with content: {$temp} <br>";
      $list[] = $temp;
      $pairs++;
   }
}
?>
[/code]
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 12:51:26 vasta tsitaadiga

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?
_________________
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 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: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
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: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




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: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
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: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
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: 76 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  PHP- numbri genereerime teatud numbritega.
[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.