|  | 		    
					
        
         
          
         
	
          | |  | Returner et tilfældigt tal Fra : Silas Boye Nissen
 | 
 Dato :  01-06-06 20:23
 | 
 |  | 
 
            Jeg har benyttet funktionen:
 rand(4, 16);
 Nu ønsker jeg blot ikke længere, at funktionen skal have mulighed
 for at retunere tallene 7, 11 og 14.
 Hvordan laver man en funktion, som retunerer et tilfældigt tal
 fra 4 til 16 og udelader 7, 11 og 14?
 Jeg har søgt en del på php.net efter random eller shuffle, men
 har ikke kunnet finde nogen funktion.
 Umiddelbart forestillede jeg mig noget i stil med:
 rand(4, 5, 6, 8, 9, 10, 12, 13, 15, 16);
 Måske blot et andet funktionsnavn.
 Jeg håber på, at der er nogen, som kan hjælpe mig.
 Venlig hilsen,
 Silas Boye Nissen
 -- 
 Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
  - Pædagogiske tutorials på dansk
  - Kom godt i gang med koderne
 KLIK HER! => http://www.html.dk/tutorials |  |  | 
  Kim Schulz (01-06-2006) 
 
	
          | |  | Kommentar Fra : Kim Schulz
 | 
 Dato :  01-06-06 20:30
 | 
 |  | On 01 Jun 2006 19:22:57 GMT
 Silas Boye Nissen <web@sporvognsrejser.dk> wrote:
 
 > Jeg har benyttet funktionen:
 > rand(4, 16);
 >
 > Nu ønsker jeg blot ikke længere, at funktionen skal have mulighed
 > for at retunere tallene 7, 11 og 14.
 >
 > Hvordan laver man en funktion, som retunerer et tilfældigt tal
 > fra 4 til 16 og udelader 7, 11 og 14?
 >
 > Jeg har søgt en del på php.net efter random eller shuffle, men
 > har ikke kunnet finde nogen funktion.
 >
 > Umiddelbart forestillede jeg mig noget i stil med:
 > rand(4, 5, 6, 8, 9, 10, 12, 13, 15, 16);
 > Måske blot et andet funktionsnavn.
 >
 > Jeg håber på, at der er nogen, som kan hjælpe mig.
 
 $numbers = array(4,5,6,8,10,12,13,15,16);
 srand((float) microtime() * 10000000);
 $tal = array_rand($numbers);
 
 
 
 |  |  | 
  Henrik Hansen (02-06-2006) 
 
	
          | |  | Kommentar Fra : Henrik Hansen
 | 
 Dato :  02-06-06 09:39
 | 
 |  | Kim Schulz <kim@schulz.dk> writes:
 
 >> Jeg håber på, at der er nogen, som kan hjælpe mig.
 >
 > $numbers = array(4,5,6,8,10,12,13,15,16);
 > srand((float) microtime() * 10000000);
 > $tal = array_rand($numbers);
 
 Hvis du bruger over 4.2.0 er det så ikke nødvendigt at skrive srand
 linien da php gør det automatisk, men tror dog ikke det gør noget at
 gøre det :)
 
 --
 Henrik Hansen
 
 
 |  |  | 
   Henrik Boye (02-06-2006) 
 
	
          | |  | Kommentar Fra : Henrik Boye
 | 
 Dato :  02-06-06 13:33
 | 
 |  | 
 
            Kim Schulz <kim@schulz.dk> writes:
 > $numbers = array(4,5,6,8,10,12,13,15,16);
 > srand((float) microtime() * 10000000);
 > $tal = array_rand($numbers);
 Jeg kan ikke få det til at virke. Ved mig bliver
 alle tal mellem 4 og 16 stadig returneret uden at
 springe de pågældende tal over.
 Er der nogen, som med ord kan forklare mig, hvad
 srand-linjen gør?
 -- 
 Silas Boye Nissen
http://boyeit.dk/
http://cmforum.dk/
http://sporvognsrejser.dk/ |  |  | 
    Bent Stigsen (02-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  02-06-06 15:18
 | 
 |  | Henrik Boye wrote:
 > Kim Schulz <kim@schulz.dk> writes:
 >> $numbers = array(4,5,6,8,10,12,13,15,16);
 >> srand((float) microtime() * 10000000);
 >> $tal = array_rand($numbers);
 >
 > Jeg kan ikke få det til at virke. Ved mig bliver
 > alle tal mellem 4 og 16 stadig returneret uden at
 > springe de pågældende tal over.
 
 I eksemplet vil $tal være indexet til en værdi i $numbers.
 
 Formoder det er $numbers[$tal], som du er interesseret i.
 
 
 /Bent
 
 
 |  |  | 
     Henrik Boye (02-06-2006) 
 
	
          | |  | Kommentar Fra : Henrik Boye
 | 
 Dato :  02-06-06 17:59
 | 
 |  | 
 
            Bent Stigsen <ngap@thevoid.dk> skrev:
 > Kim Schulz <kim@schulz.dk> writes:
 >> $numbers = array(4,5,6,8,10,12,13,15,16);
 >> srand((float) microtime() * 10000000);
 >> $tal = array_rand($numbers);
 >
 >I eksemplet vil $tal være indexet til en værdi i
 $numbers.
 >
 >Formoder det er $numbers[$tal], som du er
 interesseret i.
 Er det muligt at forkorte de tre linjer til to?
 Noget i stil med:
 srand((float) microtime() * 10000000); # som også
 kan udelades efter PHP 4.2
 $tal = array_rand(array(4,5,6,8,10,12,13,15,16));
 -- 
 Silas Boye Nissen
http://boyeit.dk/
http://cmforum.dk/
http://sporvognsrejser.dk/ |  |  | 
      Bent Stigsen (03-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  03-06-06 03:01
 | 
 |  | Henrik Boye wrote:
 > Bent Stigsen <ngap@thevoid.dk> skrev:
 >> Kim Schulz <kim@schulz.dk> writes:
 >>> $numbers = array(4,5,6,8,10,12,13,15,16);
 >>> srand((float) microtime() * 10000000);
 >>> $tal = array_rand($numbers);
 >> I eksemplet vil $tal være indexet til en værdi i
 > $numbers.
 >> Formoder det er $numbers[$tal], som du er
 > interesseret i.
 >
 > Er det muligt at forkorte de tre linjer til to?
 >
 > Noget i stil med:
 > srand((float) microtime() * 10000000); # som også
 > kan udelades efter PHP 4.2
 > $tal = array_rand(array(4,5,6,8,10,12,13,15,16));
 
 Kommer an på om vi snakker i praksis eller i princippet.
 
 I princippet kan det gøres på en linie, inkl. srand om man vil.
 
 $tal = srand((float)microtime()*10000000) +
 array_rand(array(4=>0,5=>0,6=>0,8=>0,10=>0,12=>0,13=>0,15=>0,16=>0));
 
 Meeeen, i praksis kommer der sjældent noget godt ud af den slags
 krumspring. Med mindre der er tale om en klar performancemæssig eller
 praktisk gevinst, synes jeg man ligeså godt kan lade være med at tage
 det første skridt.
 
 
 /Bent
 
 
 |  |  | 
       Michael Zedeler (05-06-2006) 
 
	
          | |  | Kommentar Fra : Michael Zedeler
 | 
 Dato :  05-06-06 12:15
 | 
 |  | 
 
            Bent Stigsen wrote:
 > array_rand(array(4=>0,5=>0,6=>0,8=>0,10=>0,12=>0,13=>0,15=>0,16=>0));
 Et helt andet spørgsmål:
 Kan man ikke bare skrive array(4,5,6,8,10,12,13,15,16)?
 Mvh. Michael.
 -- 
 Which is more dangerous? TV guided missiles or TV guided families?
 I am less likely to answer usenet postings by anonymous authors.
 Visit my home page at http://michael.zedeler.dk/ |  |  | 
        Bent Stigsen (05-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  05-06-06 13:09
 | 
 |  | Michael Zedeler wrote:
 
 > Bent Stigsen wrote:
 >> array_rand(array(4=>0,5=>0,6=>0,8=>0,10=>0,12=>0,13=>0,15=>0,16=>0));
 >
 > Et helt andet spørgsmål:
 >
 > Kan man ikke bare skrive array(4,5,6,8,10,12,13,15,16)?
 
 Med "array(4=>0, ..." bliver 4 en nøgle istedet for en værdi. Det er bare
 for at kunne bruge array_rand således, at man får det ønskede tal ud med
 det samme, da array_rand finder en tilfældig nøgle/index (ikke værdi) i
 arrayet.
 
 Lige til foremålet, er det noget man *kan* gøre, ikke noget jeg mener man
 *bør* gøre. Det er en lidt dårlig byttehandel, man slipper for én linie af
 kode, mod at man får noget der er ulogisk, ufleksibelt, osv.
 
 /Bent
 
 
 |  |  | 
         Michael Zedeler (05-06-2006) 
 
	
          | |  | Kommentar Fra : Michael Zedeler
 | 
 Dato :  05-06-06 13:22
 | 
 |  | 
 
            Bent Stigsen wrote:
 > Michael Zedeler wrote:
 > 
 > 
 >>Bent Stigsen wrote:
 >>
 >>>array_rand(array(4=>0,5=>0,6=>0,8=>0,10=>0,12=>0,13=>0,15=>0,16=>0));
 >>
 >>Et helt andet spørgsmål:
 >>
 >>Kan man ikke bare skrive array(4,5,6,8,10,12,13,15,16)?
 > 
 > Med "array(4=>0, ..." bliver 4 en nøgle istedet for en værdi. Det er bare
 > for at kunne bruge array_rand således, at man får det ønskede tal ud med
 > det samme, da array_rand finder en tilfældig nøgle/index (ikke værdi) i
 > arrayet.
 Okay. Så kunne man også bare skrive 
 array_flip(array(4,5,6,8,10,12,13,15,16)). Endelig noget man kan bruge 
 array_flip til.
 > Lige til foremålet, er det noget man *kan* gøre, ikke noget jeg mener man
 > *bør* gøre. Det er en lidt dårlig byttehandel, man slipper for én linie af
 > kode, mod at man får noget der er ulogisk, ufleksibelt, osv.
 Det er ulogisk, men det er jo PHP i en nøddeskal.
 Mvh. Michael.
 -- 
 Which is more dangerous? TV guided missiles or TV guided families?
 I am less likely to answer usenet postings by anonymous authors.
 Visit my home page at http://michael.zedeler.dk/ |  |  | 
          Bent Stigsen (05-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  05-06-06 15:17
 | 
 |  | Michael Zedeler wrote:
 
 > Bent Stigsen wrote:
 >> Michael Zedeler wrote:
 >>
 >>
 >>>Bent Stigsen wrote:
 >>>
 >>>>array_rand(array(4=>0,5=>0,6=>0,8=>0,10=>0,12=>0,13=>0,15=>0,16=>0));
 >>>
 >>>Et helt andet spørgsmål:
 >>>
 >>>Kan man ikke bare skrive array(4,5,6,8,10,12,13,15,16)?
 >>
 >> Med "array(4=>0, ..." bliver 4 en nøgle istedet for en værdi. Det er bare
 >> for at kunne bruge array_rand således, at man får det ønskede tal ud med
 >> det samme, da array_rand finder en tilfældig nøgle/index (ikke værdi) i
 >> arrayet.
 >
 > Okay. Så kunne man også bare skrive
 > array_flip(array(4,5,6,8,10,12,13,15,16)). Endelig noget man kan bruge
 > array_flip til.
 
 Jo, det kan man selvfølgelig. Det er en forbedring på læsbarheden, men det
 var også den man ofrede til at starte med, ved at begynde at slå tingene
 sammen.
 Meget godt eksempel på, at formålsløse optimeringer ikke fører noget godt
 med sig. Ved at efterfølgende pynte på det, får man faktisk noget der er
 værre end udgangspunktet, idet det stadig er ufleksibelt og array_flip er
 langt mere bekosteligt end at bruge et index til at slå en værdi op i et
 array.
 
 /Bent
 
 [snip]
 
 
 |  |  | 
           Michael Zedeler (05-06-2006) 
 
	
          | |  | Kommentar Fra : Michael Zedeler
 | 
 Dato :  05-06-06 15:39
 | 
 |  | 
 
            Bent Stigsen wrote:
 > Michael Zedeler wrote:
 > Så kunne man også bare skrive
 >>array_flip(array(4,5,6,8,10,12,13,15,16)). Endelig noget man kan bruge
 >>array_flip til.
 > 
 > Jo, det kan man selvfølgelig. Det er en forbedring på læsbarheden, men det
 > var også den man ofrede til at starte med, ved at begynde at slå tingene
 > sammen.
 Jeps.
 > Meget godt eksempel på, at formålsløse optimeringer ikke fører noget godt
 > med sig. Ved at efterfølgende pynte på det, får man faktisk noget der er
 > værre end udgangspunktet, idet det stadig er ufleksibelt og array_flip er
 > langt mere bekosteligt end at bruge et index til at slå en værdi op i et
 > array.
 Det kommer an på formålet. Det er oplagt at det går langsommere med 
 array-flip (den operation tager vel o(n) ekstra tid), men min erfaring 
 siger mig at hvis man ikke har nogen grund til at programmet skal køre 
 hurtigt, skal man ikke tøve med at ofre performance til gengæld for kode 
 der er nemt at vedligeholde. Skriver man array(1=>0, 3=>0, ... 
 43432=>0), så beder man om problemer. Før eller siden kommer nogen til 
 at bytte rundt på en nøgle og en værdi, eller også er der en doven 
 programmør som før at vide at han skal slette nummer 3, hvorefter der 
 står array(1=>3, ... 43432=>0) til stor forvirring og irritation for 
 alle andre.
 Mvh. Michael.
 -- 
 Which is more dangerous? TV guided missiles or TV guided families?
 I am less likely to answer usenet postings by anonymous authors.
 Visit my home page at http://michael.zedeler.dk/ |  |  | 
            Bent Stigsen (05-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  05-06-06 17:31
 | 
 |  | Michael Zedeler wrote:
 
 > Bent Stigsen wrote:
 [snip]
 >> Meget godt eksempel på, at formålsløse optimeringer ikke fører noget godt
 >> med sig. Ved at efterfølgende pynte på det, får man faktisk noget der er
 >> værre end udgangspunktet, idet det stadig er ufleksibelt og array_flip er
 >> langt mere bekosteligt end at bruge et index til at slå en værdi op i et
 >> array.
 >
 > Det kommer an på formålet.
 
 Ved ikke helt om om vi taler lidt forbi hinanden her, omkring hvad vi anser
 for formålet, for jeg ser ikke rigtigt noget formål i det hele taget.
 
 Den formålsløse optimering jeg snakker om, er det som Henrik lægger op til,
 nemlig at skrive koden på færre linier.
 Den efterfølgende ændring som du foreslår, er der tydeligvis et formål med
 da det gør det mere læseligt, men det ser jeg som lidt ligegyldigt siden
 der ikke var noget formål med den første ændring.
 
 Jeg ser bare at slutresultatet er noget der er værre end udgangspunktet, i
 en process hvor man først optimerer for enkelte linier kode og evt. en
 anelse performance, og bagefter i en erkendelse af det er grimt, pynter på
 det for at gøre det mere læsbart ved at ofre performance.
 
 
 > Det er oplagt at det går langsommere med
 > array-flip (den operation tager vel o(n) ekstra tid), men min erfaring
 > siger mig at hvis man ikke har nogen grund til at programmet skal køre
 > hurtigt, skal man ikke tøve med at ofre performance til gengæld for kode
 > der er nemt at vedligeholde.
 
 Det er også min erfaring. Det er også derfor jeg anser optimeringen af
 udgangspunktet for formålsløs.
 array-flip tjener kun et formål, netop fordi man har villet skrive den samme
 kode på færre linier, hvilket vi tilsyneladende (hvis jeg læser dig
 rigtigt) er enige om at man ikke skal gøre uden grund.
 
 
 > Skriver man array(1=>0, 3=>0, ...
 > 43432=>0), så beder man om problemer. Før eller siden kommer nogen til
 > at bytte rundt på en nøgle og en værdi, eller også er der en doven
 > programmør som før at vide at han skal slette nummer 3, hvorefter der
 > står array(1=>3, ... 43432=>0) til stor forvirring og irritation for
 > alle andre.
 
 Sjusk kan man ikke rigtigt beskytte sig mod, men jo det er grimt og
 uhensigtsmæssigt af helvedes til :). Det synes jeg heller ikke jeg lagde
 skjul på.
 
 /Bent
 
 
 |  |  | 
             Michael Zedeler (05-06-2006) 
 
	
          | |  | Kommentar Fra : Michael Zedeler
 | 
 Dato :  05-06-06 20:51
 | 
 |  | 
 
            Bent Stigsen wrote:
 > Michael Zedeler wrote:
 >
 >>Det er oplagt at det går langsommere med 
 >>array-flip (den operation tager vel o(n) ekstra tid), men min erfaring
 >>siger mig at hvis man ikke har nogen grund til at programmet skal køre
 >>hurtigt, skal man ikke tøve med at ofre performance til gengæld for kode
 >>der er nemt at vedligeholde.
 > 
 > Det er også min erfaring. Det er også derfor jeg anser optimeringen af
 > udgangspunktet for formålsløs. 
 > array-flip tjener kun et formål, netop fordi man har villet skrive den samme
 > kode på færre linier, hvilket vi tilsyneladende (hvis jeg læser dig
 > rigtigt) er enige om at man ikke skal gøre uden grund.
 Så er det der vi ikke er enige (med mindre der står et "ikke" for 
 meget). Jeg mener at array_flip er en rædsom funktion, som er en 
 konsekvens af nogle dårlige (eller måske manglende) beslutninger omkring 
 PHPs måde at håndtere arrays på, men generelt mener jeg at kompakt kode 
 (indenfor rimelighedens grænser) er nemmere at vedligeholde. Jeg synes 
 at det er bedre at bruge array_flip (og risikere at en enkelt udvikler 
 er nødt til at slå funktionen op i manualen), frem for at have redundant 
 kode (en masse "=>0"), som kan give anledning til tastefejl, der er 
 nemme at overse.
 >>Skriver man array(1=>0, 3=>0, ... 
 >>43432=>0), så beder man om problemer. Før eller siden kommer nogen til
 >>at bytte rundt på en nøgle og en værdi, eller også er der en doven
 >>programmør som før at vide at han skal slette nummer 3, hvorefter der
 >>står array(1=>3, ... 43432=>0) til stor forvirring og irritation for
 >>alle andre.
 > 
 > Sjusk kan man ikke rigtigt beskytte sig mod, men jo det er grimt og
 > uhensigtsmæssigt af helvedes til :). Det synes jeg heller ikke jeg lagde
 > skjul på. 
 Man kan reducere antallet af fejl ved at reducere størrelsen af sin 
 kode. Jo mindre kode, jo færre steder at sjuske. Ikke nok med at jeg har 
 læst det i en bog - jeg har også lært det af bitter erfaring    Mvh. Michael.
 -- 
 Which is more dangerous? TV guided missiles or TV guided families?
 I am less likely to answer usenet postings by anonymous authors.
 Visit my home page at http://michael.zedeler.dk/ |  |  | 
              Bent Stigsen (06-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  06-06-06 00:45
 | 
 |  | 
 
            Michael Zedeler wrote:
 > Bent Stigsen wrote:
 >> Michael Zedeler wrote:
 >>
 >>>Det er oplagt at det går langsommere med
 >>>array-flip (den operation tager vel o(n) ekstra tid), men min erfaring
 >>>siger mig at hvis man ikke har nogen grund til at programmet skal køre
 >>>hurtigt, skal man ikke tøve med at ofre performance til gengæld for kode
 >>>der er nemt at vedligeholde.
 >> 
 >> Det er også min erfaring. Det er også derfor jeg anser optimeringen af
 >> udgangspunktet for formålsløs.
 >> array-flip tjener kun et formål, netop fordi man har villet skrive den
 >> samme kode på færre linier, hvilket vi tilsyneladende (hvis jeg læser dig
 >> rigtigt) er enige om at man ikke skal gøre uden grund.
 > 
 > Så er det der vi ikke er enige (med mindre der står et "ikke" for
 > meget). Jeg mener at array_flip er en rædsom funktion, som er en
 > konsekvens af nogle dårlige (eller måske manglende) beslutninger omkring
 > PHPs måde at håndtere arrays på, men generelt mener jeg at kompakt kode
 > (indenfor rimelighedens grænser) er nemmere at vedligeholde. Jeg synes
 > at det er bedre at bruge array_flip (og risikere at en enkelt udvikler
 > er nødt til at slå funktionen op i manualen), frem for at have redundant
 > kode (en masse "=>0"), som kan give anledning til tastefejl, der er
 > nemme at overse.
 Ok, så er vi uenige. Lige med array_flip, for at undgå at skulle skrive en
 masse ekstra tegn, ville jeg nok kunne overtales, men tastefejl er ikke
 lige noget der generelt ville bekymre mig. 
 Men omskrivning af tre liniers kode til én i givne situation, virker derimod
 ret forkert på mig. Jeg kan ikke se det skulle være nemmere at vedligeholde
 og egentlig noget jeg kun med lidt god vilje, ville anse for "indenfor
 rimelighedens grænser" af kompakt kode.
 Med det aktuelle eksempel:
 --- kompakte version ---
 $the_number = array_rand(array_flip(array(4,5,6,8,10,12,13,15,16)));
 ---
 Jeg ville straks brokke mig over, er at arrayet er angivet inline. Det er
 nok tåleligt hvis der ikke er flere værdier, men ikke specielt
 vedligeholdelsesvenligt. Duer under alle omstændigheder ikke, hvis man
 skulle få lyst til at bruge de samme værdier et andet sted.
 Hvis man endelig ville gøre noget mere kompakt, så skulle det måske være at
 bruge retur-værdien fra array_rand direkte som index.
 ( $numbers[array_rand($numbers)] ) 
 >>>Skriver man array(1=>0, 3=>0, ...
 >>>43432=>0), så beder man om problemer. Før eller siden kommer nogen til
 >>>at bytte rundt på en nøgle og en værdi, eller også er der en doven
 >>>programmør som før at vide at han skal slette nummer 3, hvorefter der
 >>>står array(1=>3, ... 43432=>0) til stor forvirring og irritation for
 >>>alle andre.
 >> 
 >> Sjusk kan man ikke rigtigt beskytte sig mod, men jo det er grimt og
 >> uhensigtsmæssigt af helvedes til :). Det synes jeg heller ikke jeg lagde
 >> skjul på.
 > 
 > Man kan reducere antallet af fejl ved at reducere størrelsen af sin
 > kode. Jo mindre kode, jo færre steder at sjuske. Ikke nok med at jeg har
 > læst det i en bog - jeg har også lært det af bitter erfaring    Øhm, har du en reference til den bog, jeg kunne godt tænke mig at læse hvad
 der skulle ligge bag den ide. Det er ikke lige noget jeg har hørt.
 Det er ikke fordi jeg ikke kan fatte mig i korthed, men det er ihvertfald
 ikke noget jeg gør bevidst, eller lader kodestørrelsen diktere en
 omskrivning af noget kode.
 /Bent
            
             |  |  | 
               Henrik Boye (06-06-2006) 
 
	
          | |  | Kommentar Fra : Henrik Boye
 | 
 Dato :  06-06-06 10:52
 | 
 |  | 
 
            Bent Stigsen <ngap@thevoid.dk> skrev:
 >Med det aktuelle eksempel:
 >--- kompakte version ---
 >$the_number =
 >array_rand(array_flip(array(4,5,6,8,1
 >0,12,13,15,16)));
 Her er den første metode, som løser min
 problemstilling og dermed virker (ved mig).
 Sikken lang indbyrdes samtale I har kørt. Jeg
 siger mange tak for hjælpen.
 -- 
 Silas Boye Nissen
http://boyeit.dk/
http://cmforum.dk/
http://sporvognsrejser.dk/ |  |  | 
                Bent Stigsen (06-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  06-06-06 13:55
 | 
 |  | Henrik Boye wrote:
 > Bent Stigsen <ngap@thevoid.dk> skrev:
 >> Med det aktuelle eksempel:
 >> --- kompakte version ---
 >> $the_number =
 >> array_rand(array_flip(array(4,5,6,8,1
 >> 0,12,13,15,16)));
 >
 > Her er den første metode, som løser min
 > problemstilling og dermed virker (ved mig).
 >
 > Sikken lang indbyrdes samtale I har kørt. Jeg
 > siger mange tak for hjælpen.
 
 Ja, der er lidt ud over din situation, men fint du fik løst dit
 problem. Jeg håber ikke du bare anser stedet her for en
 problemløsningsgruppe, selvom det indimellem mere eller mindre kan
 virke sådan. Jeg vil nu gerne betragte det som en diskussionsgruppe.
 
 /Bent
 
 
 |  |  | 
                 Henrik Boye (06-06-2006) 
 
	
          | |  | Kommentar Fra : Henrik Boye
 | 
 Dato :  06-06-06 15:20
 | 
 |  | 
 
            Bent Stigsen <ngap@thevoid.dk> skrev:
 >Ja, der er lidt ud over din situation, men fint
 du fik løst dit 
 >problem. Jeg håber ikke du bare anser stedet her
 for en 
 >problemløsningsgruppe, selvom det indimellem mere
 eller mindre kan 
 >virke sådan. Jeg vil nu gerne betragte det som en
 diskussionsgruppe.
 Fuldstændig enig! Det er diskussionerne, der er
 spændende. Ofte tager diskussionerne blot
 udgangspunkt i en problemstilling.
 -- 
 Silas Boye Nissen
http://boyeit.dk/
http://cmforum.dk/
http://sporvognsrejser.dk/ |  |  | 
               Michael Zedeler (06-06-2006) 
 
	
          | |  | Kommentar Fra : Michael Zedeler
 | 
 Dato :  06-06-06 13:44
 | 
 |  | 
 
            Bent Stigsen wrote:
 > Michael Zedeler wrote:
 > 
 > 
 >>Bent Stigsen wrote:
 >>
 >>>Michael Zedeler wrote:
 >>>
 >>>
 >>>>Det er oplagt at det går langsommere med
 >>>>array-flip (den operation tager vel o(n) ekstra tid), men min erfaring
 >>>>siger mig at hvis man ikke har nogen grund til at programmet skal køre
 >>>>hurtigt, skal man ikke tøve med at ofre performance til gengæld for kode
 >>>>der er nemt at vedligeholde.
 >>>
 >>>Det er også min erfaring. Det er også derfor jeg anser optimeringen af
 >>>udgangspunktet for formålsløs.
 >>>array-flip tjener kun et formål, netop fordi man har villet skrive den
 >>>samme kode på færre linier, hvilket vi tilsyneladende (hvis jeg læser dig
 >>>rigtigt) er enige om at man ikke skal gøre uden grund.
 >>
 >>Så er det der vi ikke er enige (med mindre der står et "ikke" for
 >>meget). Jeg mener at array_flip er en rædsom funktion, som er en
 >>konsekvens af nogle dårlige (eller måske manglende) beslutninger omkring
 >>PHPs måde at håndtere arrays på, men generelt mener jeg at kompakt kode
 >>(indenfor rimelighedens grænser) er nemmere at vedligeholde. Jeg synes
 >>at det er bedre at bruge array_flip (og risikere at en enkelt udvikler
 >>er nødt til at slå funktionen op i manualen), frem for at have redundant
 >>kode (en masse "=>0"), som kan give anledning til tastefejl, der er
 >>nemme at overse.
 > 
 > Ok, så er vi uenige. Lige med array_flip, for at undgå at skulle skrive en
 > masse ekstra tegn, ville jeg nok kunne overtales, men tastefejl er ikke
 > lige noget der generelt ville bekymre mig. 
 > Men omskrivning af tre liniers kode til én i givne situation, virker derimod
 > ret forkert på mig. Jeg kan ikke se det skulle være nemmere at vedligeholde
 > og egentlig noget jeg kun med lidt god vilje, ville anse for "indenfor
 > rimelighedens grænser" af kompakt kode.
 > 
 > Med det aktuelle eksempel:
 > --- kompakte version ---
 > $the_number = array_rand(array_flip(array(4,5,6,8,10,12,13,15,16)));
 > ---
 > Jeg ville straks brokke mig over, er at arrayet er angivet inline. Det er
 > nok tåleligt hvis der ikke er flere værdier, men ikke specielt
 > vedligeholdelsesvenligt. Duer under alle omstændigheder ikke, hvis man
 > skulle få lyst til at bruge de samme værdier et andet sted.
 I det pågældende eksempel er der ikke rigtig andre muligheder. Hvis man 
 bygger videre på koden, skal værdien selvfølgelig løftes op.
 > Hvis man endelig ville gøre noget mere kompakt, så skulle det måske være at
 > bruge retur-værdien fra array_rand direkte som index.
 > ( $numbers[array_rand($numbers)] ) 
 Klart nok.
 >>Man kan reducere antallet af fejl ved at reducere størrelsen af sin
 >>kode. Jo mindre kode, jo færre steder at sjuske. Ikke nok med at jeg har
 >>læst det i en bog - jeg har også lært det af bitter erfaring    > 
 > Øhm, har du en reference til den bog, jeg kunne godt tænke mig at læse hvad
 > der skulle ligge bag den ide. Det er ikke lige noget jeg har hørt.
 Det er et meget udbredt koncept. Spørg en vilkårlig lektor i datalogi om 
 det og han vil genkende det. SÃ¥ vidt jeg husker hedder bogen "Reliable 
 Software Engineering". Jeg har den liggende i en kasse i kælderen. Det 
 skal dog ikke læses som et tegn på at jeg har opgivet at skrive 
 pålidelige programmer    > Det er ikke fordi jeg ikke kan fatte mig i korthed, men det er ihvertfald
 > ikke noget jeg gør bevidst, eller lader kodestørrelsen diktere en
 > omskrivning af noget kode.
 Princippet med at skrive minimal kode gælder kun med den forudsætning at 
 man overholder almindelig god praksis for programmering. Hvis man 
 omdøber alle sine funktioner til navne der kun indeholder et eller to 
 tegn, samt fjerner al whitespace, hjælper det selvfølgelig ikke noget.
 Det ser ud til at correct by construction (CBYC) - paradigmet bygger på 
 denne (og flere andre) observationer.
 Mvh. Michael.
 -- 
 Which is more dangerous? TV guided missiles or TV guided families?
 I am less likely to answer usenet postings by anonymous authors.
 Visit my home page at http://michael.zedeler.dk/ |  |  | 
                Bent Stigsen (06-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  06-06-06 15:50
 | 
 |  | 
 
            Michael Zedeler wrote:
 > Bent Stigsen wrote:
 >> Michael Zedeler wrote:
 [snip]
 >>>Man kan reducere antallet af fejl ved at reducere størrelsen af sin
 >>>kode. Jo mindre kode, jo færre steder at sjuske. Ikke nok med at jeg har
 >>>læst det i en bog - jeg har også lært det af bitter erfaring    >> 
 >> Øhm, har du en reference til den bog, jeg kunne godt tænke mig at læse
 >> hvad der skulle ligge bag den ide. Det er ikke lige noget jeg har hørt.
 > 
 > Det er et meget udbredt koncept. Spørg en vilkårlig lektor i datalogi om
 > det og han vil genkende det. SÃ¥ vidt jeg husker hedder bogen "Reliable
 > Software Engineering". Jeg har den liggende i en kasse i kælderen. Det
 > skal dog ikke læses som et tegn på at jeg har opgivet at skrive
 > pålidelige programmer    Datalogi har godt nok ikke været mit hovedfag, men lidt har jeg da haft. Det
 eneste jeg husker mine lærere pointere tilnærmelsesvis i den retning er;
 refactoring som ofte kan trimme koden væsentlig, KISS-princippet eller en
 fornuftig algoritme selvfølgelig, men aldrig kodereduktion som ikke et mål
 i sig selv. 
 Jeg kan ikke lige finde noget med titlen du gav, hvis du falder over den må
 du gerne give mig et prag.
 >> Det er ikke fordi jeg ikke kan fatte mig i korthed, men det er ihvertfald
 >> ikke noget jeg gør bevidst, eller lader kodestørrelsen diktere en
 >> omskrivning af noget kode.
 > 
 > Princippet med at skrive minimal kode gælder kun med den forudsætning at
 > man overholder almindelig god praksis for programmering. Hvis man
 > omdøber alle sine funktioner til navne der kun indeholder et eller to
 > tegn, samt fjerner al whitespace, hjælper det selvfølgelig ikke noget.
 > 
 > Det ser ud til at correct by construction (CBYC) - paradigmet bygger på
 > denne (og flere andre) observationer.
 Hmm, det synes jeg nu ellers jeg praktiserer i vid udstrækning. Er vi enige
 om at CBYC sådan rundt regnet siger, at man får et korrekt program, hvis
 man tager udgangspunkt i en verificeret algoritme/model og følger modellen
 i opbygningen af programmet?
 Ved at begynde at finde på krumspring for at reducere kode, bryder man jo
 netop det princip, at følge en verificeret model.
 /Bent
            
             |  |  | 
                 Michael Zedeler (06-06-2006) 
 
	
          | |  | Kommentar Fra : Michael Zedeler
 | 
 Dato :  06-06-06 20:31
 | 
 |  | 
 
            Bent Stigsen wrote:
 > 
 > Datalogi har godt nok ikke været mit hovedfag, men lidt har jeg da haft. Det
 > eneste jeg husker mine lærere pointere tilnærmelsesvis i den retning er;
 > refactoring som ofte kan trimme koden væsentlig, KISS-princippet eller en
 > fornuftig algoritme selvfølgelig, men aldrig kodereduktion som ikke et mål
 > i sig selv.
 Refactoring bruger man normalt om den process at redesigne kode, som er 
 designet dårligt. F. eks. at splitte klasser der varetager for mange 
 forskellige opgaver og den slags. Jeg ved ikke om det er i den 
 sammenhæng, du nævner det.
 > Jeg kan ikke lige finde noget med titlen du gav, hvis du falder over den må
 > du gerne give mig et prag.
 Ok.
 >>Det ser ud til at correct by construction (CBYC) - paradigmet bygger på
 >>denne (og flere andre) observationer.
 > 
 > Hmm, det synes jeg nu ellers jeg praktiserer i vid udstrækning. Er vi enige
 > om at CBYC sådan rundt regnet siger, at man får et korrekt program, hvis
 > man tager udgangspunkt i en verificeret algoritme/model og følger modellen
 > i opbygningen af programmet?
 Jeg ved ikke nok om CBYC til at kunne sige mere. Det er en disciplin i 
 sig selv, som praktiseres af virksomheder, der udvikler software, der 
 skal være meget, meget driftsikkert.
 > Ved at begynde at finde på krumspring for at reducere kode, bryder man jo
 > netop det princip, at følge en verificeret model.
 Ja. Jeg benytter ikke nogen bestemt udviklingsmodel eller -metode. Det 
 er også derfor jeg skrev at mit princip kun indgår som del i et større 
 system, nemlig CBYC.
 Mvh. Michael.
 -- 
 Which is more dangerous? TV guided missiles or TV guided families?
 I am less likely to answer usenet postings by anonymous authors.
 Visit my home page at http://michael.zedeler.dk/ |  |  | 
                  Bent Stigsen (07-06-2006) 
 
	
          | |  | Kommentar Fra : Bent Stigsen
 | 
 Dato :  07-06-06 16:33
 | 
 |  | Michael Zedeler wrote:
 
 > Bent Stigsen wrote:
 >>
 >> Datalogi har godt nok ikke været mit hovedfag, men lidt har jeg da haft.
 >> Det eneste jeg husker mine lærere pointere tilnærmelsesvis i den retning
 >> er; refactoring som ofte kan trimme koden væsentlig, KISS-princippet
 >> eller en fornuftig algoritme selvfølgelig, men aldrig kodereduktion som
 >> ikke et mål i sig selv.
 >
 > Refactoring bruger man normalt om den process at redesigne kode, som er
 > designet dårligt. F. eks. at splitte klasser der varetager for mange
 > forskellige opgaver og den slags. Jeg ved ikke om det er i den
 > sammenhæng, du nævner det.
 
 Ja fx, men også bare generelt i forbindelse med ændringer i kode. Man
 starter med noget som er skrevet til at kunne X, så tilføjer man Y, og
 når man kommer til Z, hænger tingene måske bare ikke sammen mere.
 
 [snip]
 >>>Det ser ud til at correct by construction (CBYC) - paradigmet bygger på
 >>>denne (og flere andre) observationer.
 >>
 >> Hmm, det synes jeg nu ellers jeg praktiserer i vid udstrækning. Er vi
 >> enige om at CBYC sådan rundt regnet siger, at man får et korrekt program,
 >> hvis man tager udgangspunkt i en verificeret algoritme/model og følger
 >> modellen i opbygningen af programmet?
 >
 > Jeg ved ikke nok om CBYC til at kunne sige mere. Det er en disciplin i
 > sig selv, som praktiseres af virksomheder, der udvikler software, der
 > skal være meget, meget driftsikkert.
 
 Ligesom togdriften :)
 
 >> Ved at begynde at finde på krumspring for at reducere kode, bryder man jo
 >> netop det princip, at følge en verificeret model.
 >
 > Ja. Jeg benytter ikke nogen bestemt udviklingsmodel eller -metode. Det
 > er også derfor jeg skrev at mit princip kun indgår som del i et større
 > system, nemlig CBYC.
 
 Jeg må indrømme jeg er lidt skeptisk. Jeg prøver så vidt muligt at holde mig
 til den algoritme/fremgangsmåde/model (med øje for hvad det skal kodes i)
 jeg har sat mig for, netop fordi jeg så (i tråd med CBYC) ikke behøver at
 kontrollere programmet som helhed, men kan nøjes med test af de enkelte
 dele af programmet. Jeg skulle mene at det også gør det nemmere at
 vedligeholde, teoretisk fordi små ændringer i modellen kun udmønter sig i
 små ændringer i koden. Det tror jeg godt jeg kan vise med Henriks
 oprindelige problem som eksempel.
 
 Med at få et tilfældigt tal ud af en bestemt mængde af tal, har vi
 fremgangsmåden:
 - definer tal i indekseret datastruktur
 - udvælg et tilfældigt index tilhørende datastruktur
 - brug index på datastruktur til at udpege tilfældigt tal
 
 Det omsætter vi helt slavisk til:
 $numbers = array(4,5,6,8,10,12,13,15,16);
 $index = array_rand($numbers);
 $tal = $numbers[$index];
 
 Læg mærke til at man i fremgangsmåden snildt kan udskifte tal med objekter,
 uden at det ændrer noget radikalt, og at det samme gælder for koden.
 Men det er jo ikke sjovt, så i stedet vil jeg lave det om, så valget af
 tallet stadig er tilfældigt men bliver vægtet individuelt med et tal,
 altså:
 - definer vægtet tal i indekseret datastruktur
 - udvælg med vægtning et tilfældigt index tilhørende datastruktur
 - brug index på datastruktur til at udpege tilfældigt tal
 
 Og fordi fremgangsmåden stort set er den samme, kan vi hurtigt
 modificere/genbruge den oprindelige kode til:
 
 $numbers = array(
    array('value' => 4, 'weight'=> 1),
    array('value' => 5, 'weight'=> 2),
    array('value' => 6, 'weight'=> 1)
 );
 $index = array_weighed_rand($numbers);
 $tal = $numbers[$index]['value'];
 
 Det *eneste* vi skal sikre os, er at den nye array_weighed_rand er korrekt,
 så vil resten være korrekt, fordi vi allerede ved at den overordnede
 fremgangsmåde var korrekt.
 Den skal så bare skrives, og jeg udtænker en plan:
 - udregn sum, ved summation af vægt fra hvert elementer
 - vælg tilfældigt tal mellem 1 og sum
 - find index hvor sum af vægte fra første op til index er lig eller
 større end den tilfældigt valgte værdi.
 
 Med minimalist kasket på og omsat til kode og viklet sammen til godt en
 linie, har jeg fået det til:
 function array_weighed_rand($array) {
    for ( $val=rand(1, array_reduce($array, create_function('$v,$w','return
 $v+$w["weight"];'), 0)); ( list($idx,$v) = each($array) )&&( $val -=
 $v['weight'] ), 1; ) if ($val<=0) return $idx;
 }
 
 Skidtet virker og alle er glade, men nu vil jeg lave om på vægtningsmodellen
 så vægtning af et element smitter af på nabo-elementer, og definerer vægten
 (w') af det i'te element af n elementer som:
    w'[i] = 0.1*w[i-1] + 0.8*w[i] + 0.1*w[i+1]
    w[0] = w[1]
    w[n+1] = w[n]
 
 Det er selvfølgelig lidt snedigt valgt, for kun at få en lille ændring.
 Det ændrer ikke noget på den overordnede fremgangsmåde, så det er *kun* i
 array_weighed_rand-funktion der skal ændres.
 Og i den er det begrænset hvad der skal ændres. Den totale sum bliver det
 samme, så den kode ville jeg kunne springe over. Det tilfældige tal(sum)
 bliver nødt til at være et decimaltal, men det er kun en mindre ting. Det
 med at finde det rigtige index er anderledes, så det må der kigges på.
 Men nu er problemet bare at jeg ikke har fulgt min planlagte fremgangsmåde,
 så jeg kan ikke bare udpege enkelte dele og fedte lidt i dem, men jeg er
 nødtvunget til at gennemskue hvad det er jeg har lavet i en helhed, for at
 sikre mig jeg ikke laver ged i det. Nu har jeg selv lige skrevet det, så
 jeg vil nok lige kunne fedte den til i en håndvending, men om en måned
 ville jeg lige skulle læse det to gange. Under alle omstændigheder, ville
 jeg kraftigt overveje bare at skrive det forfra, fordi det er bøvlet at
 have med at gøre.
 
 Jeg kunne selvfølgelig godt have skrevet funktionen lidt nemmere at gå til,
 men det var i forvejen kun på tre linier, og det er primært for at
 illustrere, at lægger man kode sammen uden speciel grund andet end at det
 bliver kortere, og uden hensyntagen til hvad der egentlig var planen med
 det hele, så giver det problemer som man i sidste ende må bokse med.
 
 Så, jeg køber ikke helt den med at kodereduktion i sig selv giver færre
 fejl. I hvertfald ikke på den måde. Der må følge noget mere med i den
 påstand, som at vælge den algoritme, der kræver færre operationer. Et eller
 andet konkret, der sætter en grænse for hvor langt man skal gå.
 
 
 /Bent
 
 
 |  |  | 
  Kim Schulz (02-06-2006) 
 
	
          | |  | Kommentar Fra : Kim Schulz
 | 
 Dato :  02-06-06 13:40
 | 
 |  | On 02 Jun 2006 12:33:27 GMT
 Henrik Boye <gizmo@paradis.dk> wrote:
 
 > Kim Schulz <kim@schulz.dk> writes:
 > > $numbers = array(4,5,6,8,10,12,13,15,16);
 > > srand((float) microtime() * 10000000);
 > > $tal = array_rand($numbers);
 >
 > Jeg kan ikke få det til at virke. Ved mig bliver
 > alle tal mellem 4 og 16 stadig returneret uden at
 > springe de pågældende tal over.
 >
 > Er der nogen, som med ord kan forklare mig, hvad
 > srand-linjen gør?
 >
 
 man kan ikke lave 100% tilfældighed i en computer da det altid afhænger
 af en eller anden algoritme. Derfor så fodrer man random algoritmen med
 et tal for at den ud fra det kan lave en random som ikke er den samme
 som sidste gang algoritmen blev kørt. Til dette bruger man i det
 ovenstående tid som input til algoritmen.
 
 
 |  |  | 
  Kim Schulz (02-06-2006) 
 
	
          | |  | Kommentar Fra : Kim Schulz
 | 
 Dato :  02-06-06 18:02
 | 
 |  | On 02 Jun 2006 16:59:26 GMT
 Henrik Boye <gizmo@paradis.dk> wrote:
 
 > Bent Stigsen <ngap@thevoid.dk> skrev:
 > > Kim Schulz <kim@schulz.dk> writes:
 > >> $numbers = array(4,5,6,8,10,12,13,15,16);
 > >> srand((float) microtime() * 10000000);
 > >> $tal = array_rand($numbers);
 > >
 > >I eksemplet vil $tal være indexet til en værdi i
 > $numbers.
 > >
 > >Formoder det er $numbers[$tal], som du er
 > interesseret i.
 >
 > Er det muligt at forkorte de tre linjer til to?
 >
 > Noget i stil med:
 > srand((float) microtime() * 10000000); # som også
 > kan udelades efter PHP 4.2
 > $tal = array_rand(array(4,5,6,8,10,12,13,15,16));
 
 nej for du skal bruge $tal som key til at finde en værdi i dit array.
 
 $foo = array(1,2,4,5,6,7);
 $resultat = $foo[$tal];
 
 
 
 
 
 
 |  |  | 
 |  |