насчёт уникальности рандоминга PHP

Discussion in 'PHP' started by mac737, 6 Mar 2010.

  1. mac737

    mac737 New Member

    Joined:
    22 Jan 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    странности рандоминга (PHP)

    Нужно было сделать что то вроде генератора ников на пхп. Много чего нашёл готового, но когда стал разбираться со всем этим мне показался странным процент уникальности такой генерки.

    Вот простенький скрипт
    PHP:
    <?php
    $rands 
    null;
    for (
    $j=0;$j<10000;$j++)//число генерируемых ников за раз 
        
    $rands[] = generate_name(2); // 2- это число символов в нике 
    echo count(array_unique($rands)).'<br>'//здесь из массива выбираются только уникальные значения 

    $rands null;
    for (
    $j=0;$j<10000;$j++)
        
    $rands[] = generate_name(3);
    echo 
    count(array_unique($rands)).'<br>';

    $rands null;
    for (
    $j=0;$j<10000;$j++) 
        
    $rands[] = generate_name(4);
    echo 
    count(array_unique($rands)).'<br>';

    $rands null;
    for (
    $j=0;$j<10000;$j++)
        
    $rands[] = generate_name(10);
    echo 
    count(array_unique($rands)).'<br>';

    $rands null;
    for (
    $j=0;$j<10000;$j++)
        
    $rands[] = generate_name(20);
    echo 
    count(array_unique($rands)).'<br>';

    $rands null;
    for (
    $j=0;$j<10000;$j++)
        
    $rands[] = generate_name(30);
    echo 
    count(array_unique($rands)).'<br>';

    $rands null;
    for (
    $j=0;$j<10000;$j++)
        
    $rands[] = generate_name(40);
    echo 
    count(array_unique($rands)).'<br>';



    function 
    generate_name($len){
        
    $abc = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
        for (
    $i=0$i<$len$i++)
            
    $str .= $abc[array_rand($abc)];

        return 
    $str;
    }

    ?>
    вот что у меня возвращает такой скрипт (из раза в раз значения меняются совсем чуть-чуть)
    HTML:
    560
    2270
    1210
    1211
    1211
    1211
    1211
    
    Как 10000 3-х символьных слов могут быть более уникальны между собой в сранвении с уникальностью 10000 20-и символьных
    То ли я туплю, то ли просто что то недопонимаю..
     
    #1 mac737, 6 Mar 2010
    Last edited: 6 Mar 2010
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    http://raz0r.name/articles/predskazyvaem-sluchajnye-chisla-v-php/
     
  3. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    PHP:
     function rnd($min,$max)
        {
    //Рандомные значения
            
    $len mt_rand($min,$max);
            
    $str = array('a''b''c''d''e''f''g''h''i''j''k''l''m',
                
    'n''o''p''r''s''t''u''v''x''y''z''A''B''C''D''E',
                
    'F''G''H''I''J''K''L''M''N''P''R''S''T''U''V''X',
                
    'Y''Z''1''2''3''4''5''6''7''8''9');


            for (
    $i 0$i $len$i++)
                
    $cod .= $str[mt_rand(0count($str) - 1)];

            return 
    $cod;
        }
     
  4. mac737

    mac737 New Member

    Joined:
    22 Jan 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    спасибо за ответы
    я так понял проблема в функции array_rand ? Потому как код Doom123 работает нормально
     
  5. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    Потому что ты вероятнее всего запускал скрипт на винде, а в ней каждое сгенерированное число rand()'ом становится сидом для следующего.
     
    1 person likes this.
  6. mac737

    mac737 New Member

    Joined:
    22 Jan 2010
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    да, верно, запускал на винде. c функцией mt_rand всё отлично
    ещё раз спасибо