Wątek przeniesiony 2014-11-17 12:02 z PHP przez ŁF.

Procentowy rand();

0

Witam. Mam do napisania kod PHP który będzie losował przy każdym wejściu użytkownika jedną z 7 stron, zapisywał losowanie w cookie i za każdym kolejny razem mu ją wyświetlał.

Do napisania tego kodu jak poniżej widać użyłem funkcji radn(), z przedziałem od 1 do 7. Te rozwiązanie ma pewną wadę, mianowicie zauważyłem że liczby nie są losowanie "losowo" tylko istnieje pewna tendecja do losowania pierwszych lub ostatnich liczb. Co oznacza że na 10 losowań 3x wylosowało 1, 2x - 2, 2x - 7, 2x - 6 i 1 x 3 lub 4 lub 5 w kolejnych 10 losowaniach.

To co chciał bym zrobić to w jakiś sposób zmienić tą tendencję aby liczby w środku wylosowywały się częściel, w takim samym procentowym prawdopodobieństwie jak reszta liczb bez "faworyzowania" reszty.

Czy ktoś spotkał się już z takim problem lub ma jakieś sensowne rozwiązanie ?

Kod:

 
<?php
ob_start();
if((isset($_COOKIE['cookieNumber']))){
    include('landing'.$_COOKIE[cookieNumber].'/index.html');
} else {
    $a = rand(1,7);
    echo $a;
    switch ($a){
        case 1:
            include('landing1/index.html');
            setcookie('cookieNumber', 1);
            break;
        case 2:
            include('landing2/index.html');
            setcookie('cookieNumber', 2);
            break;
        case 3:
            include('landing3/index.html');
            setcookie('cookieNumber', 3);
            break;
        case 4:
            include('landing4/index.html');
            setcookie('cookieNumber', 4);
            break;
        case 5:
            include('landing5/index.html');
            setcookie('cookieNumber', 5);
            break;
        case 6:
            include('landing6/index.html');
            setcookie('cookieNumber', 6);
            break;
        case 7:
            include('landing7/index.html');
            setcookie('cookieNumber', 7);
            break;
    }
}
 
?>
1

Może spróbuj mt_rand()?

Ps.
Zastanów się jak byś to napisał gdyby tych stron było 100, a nie 7... Nadal switch?

3

rand() nie jest 100% losowy, to fakt

ALE

losowość NIE POLEGA na równomiernym rozłożeniu wyników!!! nie oczekuj tego NIGDY.

więc zdecyduj się, czy chcesz losowy wynik, czy może równomierne rozłożenie wyniku - tutaj potrzebujesz bazy danych i zapisywania losowania - jeżeli jakaś liczba wypada za często, to losuj dalej, aż trafisz na taką, co nie wypadała za często.

"lepsza" losowość to mt_rand()

ale jak jest napisane w dokumentacji (której oczywiście nie czytałeś, bo po co), "prawdziwą" losowość zapewni Ci w php jedynie: openssl_random_pseudo_bytes (ale będzie niedostępne w php bez openssl)

i notka dla Ciebie i innych nie czytających dokumentacji:
uniqid także nie jest losowe (a nawet zdecydowanie nie-losowe).

Pewnym obejściem tematu losowości może też być stosowanie czasu - bierzesz microtime(false), rozbijasz po spacji i bierzesz np. trzecią liczbę z części setnych. możesz też przejechać wynik z microtime() funkcją md5() i ze zwrotki wybrać/wygenerować (stałym algorytmem) liczbę pasującą do Twojego zakresu - z microtime wg logiki nie powinieneś odczuwać efektu faworyzacji określonego wyniku

1

Łatwo skrócić twój kod:

$a = losowy_element od 1 do 7

include('landing'.$a.'/index.html');
setcookie('cookieNumber', $a);

Nie potrzebujesz wtedy tego całego switch'a i przy 100 stronach długość kodu się nie zmieni.

0

dziek69, sihox - mt_rand() spełniło swoją rolę i jest znacznie lepiej, chodź nie ukrywam że zantowałem wszystkie wskazówki i na pewno kiedyś to wykorzystam, dziekuje wam za pomoc :)

Kandif - Racja, świetne podejście, dzięki za rade, zastosuje :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1