PHP уникальные 10-значные числа str_shuffle - PullRequest
1 голос
/ 22 ноября 2010

Предполагая, что у меня есть 1 миллион 10-значных уникальных числовых чисел. Если я сделаю str_shuffle для каждого из 1 миллиона номеров, сохранится ли уникальность ???? Пожалуйста, предложите


Спасибо, ребята, за некоторую ясность, но проблема остается я не хочу, чтобы у них был фактический номер. Поэтому мне нужно рандомизировать каждое число и сгенерировать эквивалентный 10-значный уникальный номер, который я могу дать клиенту и сохранить отображение в моей БД. сделать большую часть обработки для сценария, иначе я уверен, что сценарий сломается, если я буду следовать традиционному пути массивов и прочее

Ответы [ 7 ]

7 голосов
/ 22 ноября 2010

Нет.

str_shuffle('1234567890') может дать вам "3124567890".

str_shuffle('9876543210') может также дать вам "3124567890" и т. Д. И т. Д.

4 голосов
/ 22 ноября 2010

Совершенно очевидно, что ответ отрицательный.

ЛЮБЫЕ изменения в отдельных числах, которые не заботятся обо ВСЕХ других числах, могут привести к дублированию.просто смешивает цифры в одно число, так что шансы получить дубликат велики (есть какие-нибудь математические ребята, которые хотят вычислить вероятность? С нетерпением ждем некоторых комментариев по этому поводу.)

2 голосов
/ 31 декабря 2010

То, что вы ищете, это сценарий перестановки, который у меня есть для вас.

function permuteString($str) 
{ 
    $aStr = str_split($str); 
    $iSize = count($aStr); 
    $aResult = array(); 

    for ($i = 0; $i < $iSize; ++$i) 
    { 
        $sFirst = array_shift($aStr); 
        $aInner = $aStr; 
        $iInner = count($aInner); 
        for ($j = 0; $j < $iInner; ++$j) 
        { 
            $aResult[] = $sFirst . implode('', $aInner); 
            $sTmp = array_shift($aInner); 
            $aInner[] = $sTmp; 
        } 
        $aStr[] = $sFirst; 
    } 
    return $aResult; 
} 

$userinput="1234567890"; 
print_r(permuteString($userinput));

Это напечатает каждую возможную перестановку заданной пользовательской входной переменной.

2 голосов
/ 22 ноября 2010

Формулировка проблемы предполагает, что вы, возможно, захотите перетасовать элементы массива, а не содержимое этих элементов. Возможно, вам удастся сохранить уникальность, но иметь случайно распределенное множество, поменяв некоторое время элементы массива, т. Е. Заменить случайный элемент A на случайный элемент B на N итераций.

2 голосов
/ 22 ноября 2010

Пример счетчика:

<?php

$unique_numbers = array('101', '110');

foreach($unique_numbers as $number){
    echo str_shuffle($number) . PHP_EOL;
}

Я получил:

011
011
2 голосов
/ 22 ноября 2010

str_shuffle не является уникальным по умолчанию, насколько я знаю.Это просто случайно перемешивает строку.Теоретически, возможно, что все 1 миллион чисел будут одинаковыми.

1 голос
/ 29 сентября 2012

Зависит от того, что вы определяете как «уникальность».

Когда вы говорите набор из 10 миллионов цифр в 1 миллион, если вы хотите использовать str_shuffle для всех из них, а затем, когда вы говорите уникальные, вы имеете в виду по крайней мере 1 из 10 миллионов телефонных номеров в 1 миллион не существовало до перетасовки или как? Если это так, посмотрите здесь:

10! 3628800. Это больше, чем 1 миллион на много. Так что даже 2 из 3 шансов, что все числа будут случайными.

Это означает, что если вы используете str_shuffle для всех чисел, вы, скорее всего (с вероятностью более 66%) получите «уникальный» набор, независимо от того, что вы определяете как уникальный.

...