/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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];





Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste