случайно сгенерированные строки, возможно, равны?

#php

#php

Вопрос:

учитывая скрипт, который генерирует строку из 12 символов, сгенерированную случайным образом, сколько существует возможностей для того, чтобы две строки были равны?

 function rand_string( $length ) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  

    $size = strlen( $chars );
    for( $i = 0; $i < $length; $i   ) {
        $str .= $chars[ rand( 0, $size - 1 ) ];
    }

    return $str;
}
  

Комментарии:

1. Бесконечное число. Попробуйте еще раз.

2. Предупреждение: неинициализированная переменная $length в index.php строка 5.

3. 62 ^ 12, или, другими словами, много.

Ответ №1:

Предполагая, A-Za-z0-9 , что существует 62 возможных символьных значения. Следовательно, существует 62 ^ 12 (в степени) возможных строк. Это примерно 3×10 ^ 21 (3 с 21 нулями).

Предполагая идеальный генератор случайных чисел, это вероятность 1 к 3×10 ^ 21, что любые две конкретные строки будут равны.

Комментарии:

1. От одного вызова к следующему, конечно. Более 2 вызовов приводят к более высокой вероятности каждый раз.

2. Он не спрашивал о вероятностях. Он спросил о количестве возможных пар.

3. @Thilo: Или это просто плохо сформулировано.

4. @zerkms: Где-нибудь существует более высокая вероятность обнаружения коллизии. Очевидно, что вероятность между соседними парами остается постоянной.

5. @zerkms: Что? Если я сгенерирую 4 случайные строки, вероятность того, что где-то произойдет столкновение, выше, чем если бы я сгенерировал только 3 случайные строки.

Ответ №2:

Учитывая этот код и длину 12, существует 6212 возможных значения. Итак (предполагая идеально однородный генератор случайных чисел, который rand() вероятно, таковым не является), шансы равны 1 к 3226266762397899821056, что один вызов этой функции вернет любую произвольную строку из 12 символов.

OTOH, если вы вызываете функцию повторно и хотите знать, как долго вы, вероятно, не получите повторения любого ранее возвращенного значения, вам придется вызывать ее примерно 6.7 e 10 раз, чтобы иметь 50% вероятность столкновения (опять же, предполагая, что используется единый генератор случайных чисел). Вы можете получить разумное приближение количества вызовов, необходимых для любой вероятности столкновения p в диапазоне от 0 до 1, путем вычисления sqrt(-ln(1 - p) * 2 * 6212) .

Ответ №3:

Это подпадает под Парадокс рождения (сколько человек вам нужно в комнате, чтобы иметь 50%-ную вероятность того, что у двух или более человек будет один и тот же день рождения).

Ваши 12 строк длиной 62 символа составляют около 72 бит. С приблизительным описанием, приведенным здесь, вы можете ожидать, что сгенерируете около SQRT ((pi / 2) * 62^12)) = 7. 112×10 ^ 10 строк до возникновения коллизии. Итак, примерно 1 из 70 миллиардов.