Vra

Ek weet dat net die gebruik van rand() is voorspelbaar, as jy weet wat jy doen, en het toegang tot die bediener.

Ek het 'n projek wat hoogs afhanklik keuse van 'n ewekansige getal wat so onvoorspelbaar as moontlik. So ek is op soek na voorstelle, óf ander ingeboude funksies of funksies gebruiker, wat kan genereer 'n beter ewekansige getal.

Ek gebruik hierdie om 'n bietjie toets doen:

$i = 0;

while($i < 10000){
    $rand = rand(0, 100);

    if(!isset($array[$rand])){
        $array[$rand] = 1;
    } else {
        $array[$rand]++;
    }

    sort($array);
    $i++;
}

Ek het gevind dat die resultate eweredig te versprei, en daar is 'n vreemde patroon om die aantal kere wat elke getal is gegenereer.

Was dit nuttig?

Oplossing

Voeg, vermenigvuldig, of truncating n swak ewekansige bron sal jy 'n swak ewekansige gevolg gee. Sien Inleiding tot Random en ewekansige getalle vir 'n verduideliking.

Jy is reg oor PHP rand () funksie. Sien die tweede figuur op Statistiese Analise vir 'n treffende illustrasie. (Die eerste syfer is opvallend, maar dit is getrek deur Scott Adams, nie geplot met rand ()).

Een oplossing is om 'n ware ewekansige kragopwekker gebruik soos random.org . Nog 'n, as jy op Linux / BSD / ens. is om te gebruik / dev / ewekansige . As die willekeur is sending kritiese, sal jy 'n hardeware ewekansige kragopwekker gebruik.

Ander wenke

random.org het 'n API kan jy toegang via HTTP.

  

RANDOM.ORG is 'n ware ewekansige getal diens wat willekeur genereer   via atmosferiese geraas.

Ek sou versigtig vir die indruk van ewekansigheid wees: daar is baie eksperimente waar mense die minder ewekansige verspreiding sou kies nie. Dit wil voorkom asof die gedagte is nie baie goed in die vervaardiging of die skatte van ewekansigheid.

Daar is 'n goeie artikels oor willekeur by Fourmilab , insluitend 'n ander waar random generator . Miskien kan jy ewekansige data van beide webwerwe te kry so as 'n mens af het jy nog die ander.

Fourmilab bied ook 'n toets program om ewekansigheid kontroleer. Jy kan dit gebruik om jou verskeie myRand () programme te kyk.

As vir jou laaste program, as jy 10000 waardes genereer, hoekom doen jy nie die finale waarde onder die 10 duisend kies? Jy beperk jouself tot 'n subset. Ook, sal dit nie werk as jou $ min en $ maksimum is groter as 10.000.

In elk geval, die willekeur wat jy nodig het, hang af van jou aansoek. rand () sal OK wees vir 'n online game, maar nie OK vir kriptografie (enigiets nie deeglik getoets met statistiese programme sal in elk geval nie geskik vir kriptografie wees). Jy moet die regter!

Variasie op @KG, met behulp van die millisekondes sedert tydstip as die saad vir rand?

Nog 'n manier om ewekansige getalle, soortgelyk in konsep te kry UUID

PHP weergawe 5.3 en hoër

openssl_random_pseudo_bytes(...)

Of jy kan die volgende biblioteek probeer behulp RFC4122

'n Nuwe PHP7 daar is 'n funksie wat nie presies wat jy nodig: dit genereer < a href = "http://php.net/manual/en/function.random-int.php" rel = "nofollow noreferrer"> crypto veilige pseudo-ewekansige heelgetalle.

int random_int ( int $min , int $max )
  

Genereer kriptografiese ewekansige heelgetalle wat geskik is vir gebruik is   waar onbevooroordeelde uitslag is van kritieke belang (maw geskuifel n Poker dek).

Vir 'n meer gedetailleerde verduideliking oor PRNG en CSPRNG (en hul verskil) asook waarom jou oorspronklike benadering is eintlik 'n slegte idee nie, lees asseblief my 'n ander hoogs soortgelyke antwoord .

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top