2010-11-22 138 views
1

假設我有一個100萬10位唯一數字號碼。如果我爲100萬個數字中的每一個做一個str_shuffle,唯一性會保持嗎?請建議一些清晰PHP唯一的10位數字str_shuffle


感謝球員,但問題仍然remains.Actually,上萬號,我說的都是不重複的數字(INFACT他們的手機號碼10個位數)。我想給這些百萬號給一些客戶,但我不想讓他們有實際的號碼。因此,我需要隨機化每個號碼,並生成一個等效的10位唯一號碼,我可以給客戶端,並保持我的數據庫中的映射。我在尋找對於對算法沒有做太多處理的求和算法,否則我相信如果我遵循數組和東西的傳統路徑,則腳本將分解。

回答

7

編號

str_shuffle('1234567890')可能會給你「3124567890」。

str_shuffle('')也可能給你「3124567890」,等等等等

2

str_shuffle是不是默認獨一無二的,因爲據我所知。它只是隨機洗牌的字符串。從理論上講,所有100萬個數字將是相同的。

+0

這不是問題在這裏。 – 2010-11-22 16:06:01

+0

你的意思是不夠清楚..?它回答了我認爲的問題,即'不'。 – 2010-11-22 18:44:31

4

這很明顯,答案是否定的。

ANY修改單個數字不關心所有其他數字可能會導致重複。

隨機洗牌是這樣一種修改,因爲它只是在一個數字中混合數字,所以很可能會得到一個副本(任何數學家都想要計算概率?期待一些關於這個的評論。 )

2

反例:

<?php 

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

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

我:

011 
011 
2

的問題的陳述表明你實際上可能要洗牌陣列埃爾而不是這些元素的內容。也許你可以保持唯一性,但有一個隨機分佈的集合通過交換數組的元素一段時間 - 即交換隨機元素A與隨機元素B的N次迭代。

2

你正在尋找的是一個排列腳本,我碰巧遇到了你。

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)); 

這將打印給定userinput變量的每個可能的排列組合。

1

取決於你定義的'唯一性'。

當您說100萬組的10位數字號碼時,如果您想在所有這些號碼上使用str_shuffle,然後當您說獨一無二時,您的意思是100萬個10位數電話號碼中至少有一個沒有洗牌前還是存在?如果是這樣,請看這裏:

10!是3628800.這大大超過了100萬。所以甚至有2比3的機會,所有的數字都是隨機的。

這意味着如果您在所有數字上使用str_shuffle,無論您將其定義爲唯一,您很可能(超過66%的機率)會獲得「唯一」集。