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 1, 2  järgmine
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: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
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: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
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: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
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: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
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: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
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: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
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: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




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: 67 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 60
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




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: 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 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
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  PHP- numbri genereerime teatud numbritega. mine lehele 1, 2  järgmine
[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.