[php] random numbers niet echt random?

Pagina: 1
Acties:
  • 2.188 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey,

vraagje, ik heb een scriptje gemaakt in PHP dat random een password uitspuugt. Het is alleen niet echt random. De random nummer generator spuugt getallen uit die redelijk bij elkaar in de buurt liggen. Gevolg is dat er bijvoorbeeld erg veel hoofdletters in een password zitten (bijna alle tekens) en dat een volgend password bijvoorbeeld weer voornamelijk uit getallen bestaat.

Heeft er iemand tips over hoe de random number generator wat meer random gemaakt kan worden?

Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Hoe ziet je code er nu uit?

Acties:
  • 0 Henk 'm!

  • sjongenelen
  • Registratie: Oktober 2004
  • Laatst online: 10:46
maak een dubbele random en deel die door een andere random, maal een vast getal minus het originele random??

joh :O

met deze formule bedoel ik dus integers etc. die dan natuurlijk ASCII omgezet kunnen worden naar letters (als dat gewenst is :))

[ Voor 35% gewijzigd door sjongenelen op 14-01-2008 23:15 ]

you had me at EHLO


Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

TheNymf: als je een onzinsmiley wilt gebruiken, praat dan zelf geen onzin ;) Dat maakt het niet meer random als je alleen dat aan je algoritme toevoegt, kan je beter meteen een beter algoritme nemen (of als het weinig nodig is: er output van een van de bestaande randomizers). Kijk bijv eens naar www.random.org
IMHO en AFAIK, dan :P

Als je wilt genereren, kijk dan eens naar bijv http://en.wikipedia.org/w...o-random_number_generator of eenvoudiger http://en.wikipedia.org/wiki/Linear_congruential_generator

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

Verwijderd

'Echt' random bestaat niet nee met de huidige logica, daarom wordt bij veel 'random' generators de systeemtijd of een variant/mutatie daarvan gebruikt.

Probeer eens een (kleine) delay tussen elke random stap te plaatsen, of inderdaad meerdere random getallen te combineren tot 1 teken van je password.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Zoals F_J_K zegt gewoon eens kijken naar random.org, echt random bestaat niet zolang je het door een standaard algoritme wil laten produceren. Een leuke optie is misschien nog automatisch wat random data ophalen van random.org en dat bestand aflopen tot het leeg is om daarna weer een nieuw random databestand op te halen :P

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Als je random passwords wilt genereren moet je eens op deze wikipedia pagina kijken: http://en.wikipedia.org/wiki/Random_password_generator#PHP

Daar staat zelfs dit leuke voorbeeldje op:
PHP:
1
2
3
4
5
6
7
8
function pass_gen($len) {
    $pass = '';
    srand((float) microtime() * 10000000);
    for ($i = 0; $i < $len; $i++) {
        $pass .= chr(rand(33, 126));
    }
    return $pass;
}

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
De psuedo-random number generator is een heel stuk minder voorspelbaar dan je nu omschrijft. Weet je zeker dat je hem goed gebruikt?

Als je op een PHP versie voor 4.2.0 draait vergeet dan niet de generator te seeden.

Acties:
  • 0 Henk 'm!

  • rogierslag
  • Registratie: Maart 2005
  • Laatst online: 14-10-2024
gebruik je de mt_rand() functie of de rand() functie?
Seed je de generator vaker dan één keer? Als je namelijk vaker een seed aangeeft en dat doe je met de systeemklok bijvoorbeeld, dan zal de seed waarde in de buurt van de vorige liggen en dus voorspelbaarde(re) resultaten afgeven. Dus, enkel 1 seed gebruiken (wat al niet meer nodig is als je PHP5 gebruikt, dan doet PHP dat automatisch)

Verder, post eens je random generator die je hebt gescript, want uit ervaring kan ik je zeggen dat meestal er een goede randomness inzit. Ik heb hier nog een oude random-string generator staan en die werkt toch prima: http://www.greepnaardehoorn.nl/test/random.php

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Daarnaast kun je de discussie aangaan wat random is, wanneer je 3 willekeurige getallen zal kiezen (als mens), tussen de 0 en 10, dan ligt het gemiddelde vaak tussen de 4 en 6 (1,4,9), terwijn wanneer het echt random is, de kans ook bestaat dat het alleen maar lage of hoge getallen zijn.

Je kunt dan wel weer bedenken dat het gemiddelde van 5 ooit uit zou moeten komen (maar betekend dit dat het random is?). Affijn, echt random is misschien geen random.\

Wat je kunt doen is je string controleren met een paar tellertjes.

PHP:
1
2
3
4
5
6
7
8
9
$iCapitalcount = 0;
$iNumbercount = 0;
foreach($randomstring as $char){
  if(strtoupper($char) == $char){
    $iCapitalcount++;
  }elseif(intval($char) !== false){
    $iNumbercount++;
  }
}


U get the point ;)

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Het is tegenwoordig niet meer nodig om te seeden met srand()

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
    echo rnd_string(100);

    function rnd_string($iLength)
    {   
        $sSeed      = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $sString    = "";
        $iSeed      = strlen($sSeed);
    
        for ($i = 0; $i < $iLength; $i++)
        {
            $sString .= substr($sSeed, rand() % $iSeed, 1);
        }
        
        return $sString;
    }
?>

Acties:
  • 0 Henk 'm!

Verwijderd

storeman schreef op maandag 14 januari 2008 @ 23:51:
Daarnaast kun je de discussie aangaan wat random is, wanneer je 3 willekeurige getallen zal kiezen (als mens), tussen de 0 en 10, dan ligt het gemiddelde vaak tussen de 4 en 6 (1,4,9), terwijn wanneer het echt random is, de kans ook bestaat dat het alleen maar lage of hoge getallen zijn.

Je kunt dan wel weer bedenken dat het gemiddelde van 5 ooit uit zou moeten komen (maar betekend dit dat het random is?). Affijn, echt random is misschien geen random.\
Als je random variabele een uniforme distributie U(a,b) heeft zou het gemiddelde gewoon (a + b) / 2 moeten zijn hoor. ;)

Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Verwijderd schreef op maandag 14 januari 2008 @ 23:55:
Als je random variabele een uniforme distributie U(a,b) heeft zou het gemiddelde gewoon (a + b) / 2 moeten zijn hoor. ;)
Tuurlijk, maar bij 1 trekking is 122221 is net zo random als 987898 en bij 100 trekkingen kan het gemiddelde nog best pak-em-beet (a+b)/10 zijn. De wetten van de grote aantallen gelden pas... bij grote aantallen een oneindig aantal trekkingen. Er is wat dat betreft een groot verschil tussen willekeurig zijn en op het oog willekeurig lijken.

[ Voor 9% gewijzigd door F_J_K op 15-01-2008 00:55 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op maandag 14 januari 2008 @ 23:55:
[...]
Als je random variabele een uniforme distributie U(a,b) heeft zou het gemiddelde gewoon (a + b) / 2 moeten zijn hoor. ;)
Nee hoor ;) Je bent in de war met de verwachting van het gemiddelde. Het gemiddelde zelf heeft gewoon een variantie van (a-b)²/(12n).
storeman schreef op maandag 14 januari 2008 @ 23:51:
Daarnaast kun je de discussie aangaan wat random is, wanneer je 3 willekeurige getallen zal kiezen (als mens), tussen de 0 en 10, dan ligt het gemiddelde vaak tussen de 4 en 6 (1,4,9), terwijn wanneer het echt random is, de kans ook bestaat dat het alleen maar lage of hoge getallen zijn.
Ik zie hier geen tegenspraak. Je zou eerder problemen kunnen ondervinden met onderlinge onafhankelijkheid.
MaCe1337 schreef op dinsdag 15 januari 2008 @ 01:03:
17 is statistisch gezien het meest gekozen random nummer tussen de 0 en de 20.
Tegenspraak :P

[ Voor 49% gewijzigd door GlowMouse op 15-01-2008 01:06 ]


Acties:
  • 0 Henk 'm!

  • mace
  • Registratie: Juni 2003
  • Laatst online: 20-09 15:25

mace

Sapere Aude

Het is hiet geen HK

[ Voor 81% gewijzigd door RobIII op 15-01-2008 01:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

F_J_K schreef op dinsdag 15 januari 2008 @ 00:54:
[...]

Tuurlijk, maar bij 1 trekking is 122221 is net zo random als 987898 en bij 100 trekkingen kan het gemiddelde nog best pak-em-beet (a+b)/10 zijn. De wetten van de grote aantallen gelden pas... bij grote aantallen een oneindig aantal trekkingen. Er is wat dat betreft een groot verschil tussen willekeurig zijn en op het oog willekeurig lijken.
Dat bedoelde ik natuurlijk ook :9
GlowMouse schreef op dinsdag 15 januari 2008 @ 01:01:
[...]

Nee hoor ;) Je bent in de war met de verwachting van het gemiddelde. Het gemiddelde zelf heeft gewoon een variantie van (a-b)²/(12n).
En ook dat is eigenlijk wel waar ja. Damn ik moet voortaan beter opletten in de colleges. :z

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Het is hier geen HK

[ Voor 89% gewijzigd door RobIII op 15-01-2008 01:28 ]

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kan het weer on-topic? Het is hier geen HK.

@TS: Laat je code eens zien; ik ben geen PHP kenner, maar bij mijn weten is de PRNG net zo goed als willekeurig welke andere (ongeveer); als je code correct is zal je observatie dus waarschijnlijk gewoon biased zijn; en anders ligt het zéér vermoedelijk aan je code.

[ Voor 75% gewijzigd door RobIII op 15-01-2008 01:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1