Avatar billede RasmusTheR Seniormester
02. juni 2019 - 14:34 Der er 10 kommentarer og
2 løsninger

Session med seneste 10 valg

Jeg vil gerne lave et script, som udtrækker et tilfældigt tal mellem 0 og 100 ved genload af siden. der er den hage ved det, at de seneste 10 udtrukne tal ikke må være blandt.

Er der en smart måde at gøre det?

Jeg har forsøgt at gemme de seneste valg i en sessions variabel, men kan ikke få det til at virke..
Avatar billede claes57 Ekspert
02. juni 2019 - 19:50 #1
a) Hav en tabel med de ti seneste tal (for nye kunder, brug fx 0,10,20,30 osv til 90 inkl)
b) Når du skal vælge tilfældige tal, så lav en tabel (0 til 90) med tal fra 0 til 100 uden at bruge de de ti tal i tabellen fra før (loop fra 0 til 100, og tjek hver tal med ti-tabellen)
c) du har nu en tabel med lovlige tal plads 0-90, som indeholder tal fra 0 til 100.
d) Slet tabellen med 10 tal, og vælg 10 tilfældige tal fra 0-90 tabellen, og skriv dem i en nye 10-tabel. Din 10-tabel er nu de tal, som bruger har til næste visning af siden.
Avatar billede expnet Seniormester
02. juni 2019 - 20:21 #2
Er det sådan noget du er ude efter

http://exp.zubnet.dk/1028949
Avatar billede arne_v Ekspert
02. juni 2019 - 20:24 #3
De sidste 10 tal for denen bruger eller de sidste 10 tal for alle brugere?
Avatar billede RasmusTheR Seniormester
02. juni 2019 - 21:11 #4
Det er kun for en bruger, og de skal ikke bruges efterfølgende, så jeg har tænkt at læge dem i en array og genne den i en session variabel.
Avatar billede RasmusTheR Seniormester
02. juni 2019 - 21:13 #5
Det var vist ikke helt klart, men hver gang et nyt tal trækkes, bliver det gemt i min array og det "ældste" fjernes, så der altid er ti tal i array'en.
Avatar billede ejvindh Ekspert
03. juni 2019 - 13:18 #6
Skal dette også virke hvis den samme bruger senere logger ind fra en anden maskine eller med en anden browser? For hvis ja, så var det måske mere sikkert, som skrevet i #1 at lægge det i en Mysql-database. Men det forudsætter i givet fald så, at du har et loginsystem knyttet til siden.

Under alle omstændigheder: Når du først har fat i den gemte værdi, kan du bruge en kombination af funktionerne count, array_shift og array_push for at lave det med at der max skal være 10 gemte værdier.
Avatar billede RasmusTheR Seniormester
03. juni 2019 - 14:50 #7
Nej, det skal kun være dette ene besøg på siden.
Avatar billede ejvindh Ekspert
04. juni 2019 - 14:38 #8
Måske skal du skrive lidt mere om, hvad du faktisk har gjort (fx ved at vise noget kode), så kan vi nok bedre give et bud på, hvad der går galt.
Avatar billede RasmusTheR Seniormester
05. juni 2019 - 22:25 #9
Håber I kan finde rundt i min kode ;-)

session_start();

if($arr_brugte == ''){
    $arr_brugte = array('0','0','0','0','0','0','0','0','0','0'); //sætter 10 værdier i array'en
} else {
    $arr_brugte = $session[hydrotermBrugte];
}

$hypfigurNr = (mt_rand(1,51));

while (in_array($hypfigurNr, $arr_brugte))
  {
  $hypfigurNr = (mt_rand(1,51));;
  }

array_unshift($arr_brugte,$hypfigurNr);
array_pop($arr_brugte);
$session[hydrotermBrugte] = $arr_brugte;
print_r($arr_brugte);
Avatar billede ejvindh Ekspert
06. juni 2019 - 16:56 #10
Se, det var straks meget nemmere :-)

Du har et par bøffer i koden, idet du for det første ikke bruger den rigtige $_SESSION-variabel, for det andet glemmer anførselstegn inden i de kantede parenteser, for det tredje forudsætter at $arr_brugte har mulighed for at være defineret, inden du tilbagefører $_SESSION på den.

Prøv dette istedet:

session_start();

$arr_brugte = $_SESSION["hydrotermBrugte"];

if($arr_brugte == ''){
    $arr_brugte = array('0','0','0','0','0','0','0','0','0','0'); //sætter 10 værdier i array'en
}

$hypfigurNr = (mt_rand(1,51));

while (in_array($hypfigurNr, $arr_brugte))
  {
  $hypfigurNr = (mt_rand(1,51));;
  }

array_unshift($arr_brugte,$hypfigurNr);
array_pop($arr_brugte);
$_SESSION["hydrotermBrugte"] = $arr_brugte;
print_r($arr_brugte);
Avatar billede RasmusTheR Seniormester
07. juni 2019 - 22:30 #11
PERFEKT 1000-tak :-)
Avatar billede arne_v Ekspert
09. juni 2019 - 02:03 #12
Nogen gange er det forbloeffende hvor forskelligt den samme logik kan implementeres.

Nedenstaaende kode goer stort set det samme som ejvind's kode. Men alligevel meget andeledes kode.


<?php

class RanHandler {
    private $min;
    private $max;
    private $old;
    private $queue;
    private $qix;
    public function __construct($min, $max, $old) {
        $this->min = $min;
        $this->max = $max;
        $this->old = $old;
        $this->queue = array();
        for($i = 0; $i < $this->old; $i++) $this->queue[] = $min - 1;
        $this->qix = 0;
    }
    public function getNumber() {
        do {
            $res = mt_rand($this->min, $this->max);
        } while(in_array($res, $this->queue));
        $this->queue[$this->qix] = $res;
        $this->qix = ($this->qix + 1) % $this->old;
        return $res;
    }
    public function getQueue() {
        return $this->queue;
    }
}

session_start();

if(isset($_SESSION['RanHandler'])) {
    $rh =  $_SESSION['RanHandler'];
} else {
    $rh = new RanHandler(1, 100, 10);
}

echo $rh->getNumber() . "\r\n";

print_r($rh->getQueue());

$_SESSION['RanHandler'] = $rh;
?>

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester