2010-11-22 137 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%的几率)会获得“唯一”集。