|
| Hvordan checkes et tal flere gange tilbage Fra : Kent Andersen |
Dato : 25-07-01 15:23 |
|
Hej med jer!
For kort tid siden gik jeg i gang med PHP. Jeg har valgt at lave en simpel
madbase, der indeholder madforslag og intet andet, blot for at komme igang
med at lære.
Den skal give mig 5 forslag, hvor der ikke må være gentagelser.
Jeg har lavet min randomfunktion, men hvordan checker jeg at f.eks. post 5
ikke er den samme som post 1?
Hvis jeg skal lave et array, bestående af de 5 tal, hvordan kan jeg så
checke at to tal i samme array ikke er ens?
M.v.h.
Kent
| |
Jacob Bunk Nielsen (25-07-2001)
| Kommentar Fra : Jacob Bunk Nielsen |
Dato : 25-07-01 15:52 |
|
"Kent Andersen" <kent.and@get2net.dk> writes:
> Hvis jeg skal lave et array, bestående af de 5 tal, hvordan kan jeg så
> checke at to tal i samme array ikke er ens?
Det letteste er nok at lave en contains-funktion i stil med:
function contains($x, $arr) {
for ($i=0; $i<count($arr); $i++) {
if ($arr[$i] == $x)
return true;
}
return false;
}
Så kan du for at vælge 5 tilfældige tal gøre:
$arr[0] = rand(0,$antal_opskrifter);
for ($i=1; $i<5; $i++) {
$tal = rand(0, $antal_opskrifter);
while (contains($tal, $arr)) {
$tal = rand(0,$antal_opskrifter);
}
$arr[$i] = $tal;
}
Det skulle gerne give dig 5 tilfældige til. Du skal dog passe på at du
har mere end 5 opskrifter, ellers vil det hænge
Der findes en masse array-funktioner i manualen, se
evt. < http://php.net/manual/en/function.array-filter.php>, men desværre synes
jeg ikke jeg kunne se en contains()-funktioner, men den var jo også
hurtigt skrevet
--
Jacob
If at first you do succeed, try to hide your astonishment.
http://www.bunk.cc - nu med Emacs effekt
| |
Jacob Bunk Nielsen (25-07-2001)
| Kommentar Fra : Jacob Bunk Nielsen |
Dato : 25-07-01 15:55 |
| | |
Morten Winther (25-07-2001)
| Kommentar Fra : Morten Winther |
Dato : 25-07-01 16:30 |
|
> Det letteste er nok at lave en contains-funktion i stil med:
>
> function contains($x, $arr) {
> for ($i=0; $i<count($arr); $i++) {
> if ($arr[$i] == $x)
> return true;
> }
> return false;
> }
<snip>
> Der findes en masse array-funktioner i manualen, se
> evt. < http://php.net/manual/en/function.array-filter.php>, men desværre
synes
> jeg ikke jeg kunne se en contains()-funktioner, men den var jo også
> hurtigt skrevet
I php4 er der dog "in_array":
$os = array ("Mac", "NT", "Irix", "Linux");
if (in_array ("Irix", $os)){
print "Got Irix";
}
/ morten
| |
Jacob Bunk Nielsen (25-07-2001)
| Kommentar Fra : Jacob Bunk Nielsen |
Dato : 25-07-01 16:46 |
|
"Morten Winther" <mw@get2net.dk> writes:
> > jeg ikke jeg kunne se en contains()-funktioner, men den var jo også
> > hurtigt skrevet
>
> I php4 er der dog "in_array":
Hurra for PHPs fantatiske navngivning! Mange af de andre
array-funktioner hedder array_etellerandet(), men ikke in_array, som
kunne/burde have heddet array_contains()
Jamen, så er den da lettere (og sikkert også hurtigere) at bruge end
den jeg skrev.
--
Jacob
Not better than sex but worth a try
http://www.bunk.cc - nu med Emacs effekt
| |
Henrik Christensen (25-07-2001)
| Kommentar Fra : Henrik Christensen |
Dato : 25-07-01 17:23 |
|
>Hvis jeg skal lave et array, bestående af de 5 tal, hvordan kan jeg så
>checke at to tal i samme array ikke er ens?
Prøv med array_rand http://php.net/array_rand
Mvh
HC
| |
Jonas Delfs (25-07-2001)
| Kommentar Fra : Jonas Delfs |
Dato : 25-07-01 17:31 |
|
"Henrik Christensen" <hc-news@post.cybercity.dk> skrev i en meddelelse
news:restltc748mgr7dtm22b7bv28rh4gvjpua@4ax.com...
> >Hvis jeg skal lave et array, bestående af de 5 tal, hvordan kan jeg så
> >checke at to tal i samme array ikke er ens?
>
> Prøv med array_rand http://php.net/array_rand
Sidst jeg tjekkede den funktion var den utroligt dårlig.
Det resultat den leverede var yderst ikke-tilfældigt. Det samme resultat
næsten hele tiden.
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
e72bd3e51a7937c87d28b85d677a97b2
| |
Jacob Bunk Nielsen (26-07-2001)
| Kommentar Fra : Jacob Bunk Nielsen |
Dato : 26-07-01 12:15 |
|
"Jonas Delfs" <jonas@nospam.delfs.dk> writes:
> > Prøv med array_rand http://php.net/array_rand
>
> Sidst jeg tjekkede den funktion var den utroligt dårlig.
> Det resultat den leverede var yderst ikke-tilfældigt. Det samme resultat
> næsten hele tiden.
Jeg har ikke selv prøvet den, så det er meget muligt du har ret, men
huskede du:
Don't forget to call srand() to seed the random number generator.
Så vidt jeg kan se er den funktion i øvrigt ikke brugbar for Kent, da
den ikke garanterer at der ikke kommer dupletter.
--
Jacob
Always remember that you are unique, just like everyone else.
http://www.bunk.cc - nu med Emacs effekt
| |
Jonas Delfs (26-07-2001)
| Kommentar Fra : Jonas Delfs |
Dato : 26-07-01 12:42 |
|
"Jacob Bunk Nielsen" <spam@bunk.cc> skrev i en meddelelse
news:m31yn49c1e.fsf@paven.bunk.cc...
> > > Prøv med array_rand http://php.net/array_rand
> >
> > Sidst jeg tjekkede den funktion var den utroligt dårlig.
> > Det resultat den leverede var yderst ikke-tilfældigt. Det samme resultat
> > næsten hele tiden.
>
> Jeg har ikke selv prøvet den, så det er meget muligt du har ret, men
> huskede du:
>
> Don't forget to call srand() to seed the random number generator.
Det kan jeg godt nok ikke huske - det er lang tid siden - men det kunne i
hvert fald resultere i mit problem hvis man glemte det.
> Så vidt jeg kan se er den funktion i øvrigt ikke brugbar for Kent, da
> den ikke garanterer at der ikke kommer dupletter.
Det var ikke mig der nævnte den i første omgang. :)
--
Mvh./Best Regards
Jonas Delfs, http://delfs.dk
e72bd3e51a7937c87d28b85d677a97b2
| |
Henrik Christensen (26-07-2001)
| Kommentar Fra : Henrik Christensen |
Dato : 26-07-01 15:47 |
|
>> Sidst jeg tjekkede den funktion var den utroligt dårlig.
>> Det resultat den leverede var yderst ikke-tilfældigt. Det samme resultat
>> næsten hele tiden.
Det ser ud til, at array_rand() virker på min test-server,
Windows 982 DK Apache 1.3.20 PHP 4.06
Hvis array_rand() ikke virker, så prøv med shuffle.
-----
mt_srand ((double)microtime()*1000000);
$test=array('a','b','c','d','e','f','g','h','i','j');
for ($y=1;$y<=25;$y++)
{
shuffle($test);
for($x=0;$x<5;$x++)
{
echo "$test[$x] ";
}
echo "<br>";
}
-----
>Så vidt jeg kan se er den funktion i øvrigt ikke brugbar for Kent, da
>den ikke garanterer at der ikke kommer dupletter.
Fordelen ved at bruge array_rand(),
er at der ikke kommer dubletter med.
Eks. vælg 9 bogstaver af 10 mulige.
-----
mt_srand ((double) microtime() * 1000000);
$test=array('a','b','c','d','e','f','g','h','i','j');
for ($y=1;$y<=25;$y++)
{
$t=array_rand($test,9);
sort($t);
foreach($t as $v)
{
echo "$test[$v] ";
}
echo "<br>";
}
-----
Mvh
HC
PS. Hvis der noget der svært for en computer,
så er det at lave helt tilfældige tal,
| |
Jacob Bunk Nielsen (26-07-2001)
| Kommentar Fra : Jacob Bunk Nielsen |
Dato : 26-07-01 16:03 |
|
Henrik Christensen <hc-news@post.cybercity.dk> writes:
> >Så vidt jeg kan se er den funktion i øvrigt ikke brugbar for Kent, da
> >den ikke garanterer at der ikke kommer dupletter.
>
> Fordelen ved at bruge array_rand(),
> er at der ikke kommer dubletter med.
Ja, du har ret, så længe man giver den 2 argumenter. Jeg havde lige
overset det andet argument. For det vil naturligvis *ikke* virke, hvis
man laver:
for ($i=0; $i<5; $i++) {
$flaf = array_rand($arr);
print($flaf);
}
> PS. Hvis der noget der svært for en computer,
> så er det at lave helt tilfældige tal,
I know ... der er skrevet hele bøger om den slags
--
Jacob
Tech: "Oops" Client: "Oops!?" Tech: "Err.. nothing"
http://www.bunk.cc - nu med Emacs effekt
| |
|
|