Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP唯一的10位数字str_shuffle_Php_Numbers_Unique_Digit - Fatal编程技术网

PHP唯一的10位数字str_shuffle

PHP唯一的10位数字str_shuffle,php,numbers,unique,digit,Php,Numbers,Unique,Digit,假设我有一百万个10位数的唯一数字。如果我对100万个数字中的每一个进行str_洗牌,唯一性还会保持吗????请建议 感谢各位的澄清,但问题仍然存在。事实上,我所说的百万号码都是uniques号码(实际上是10位数的手机号码)。我想把这些百万号码给一些客户,但我不希望他们有实际的号码。因此,我需要随机化每个数字,并生成一个等效的10位唯一数字,我可以给客户端,并将映射保存在我的数据库中。我正在寻找sum algo,它不会对脚本进行太多处理,否则如果我遵循数组和其他东西的传统路径,我肯定脚本会崩

假设我有一百万个10位数的唯一数字。如果我对100万个数字中的每一个进行str_洗牌,唯一性还会保持吗????请建议


感谢各位的澄清,但问题仍然存在。事实上,我所说的百万号码都是uniques号码(实际上是10位数的手机号码)。我想把这些百万号码给一些客户,但我不希望他们有实际的号码。因此,我需要随机化每个数字,并生成一个等效的10位唯一数字,我可以给客户端,并将映射保存在我的数据库中。我正在寻找sum algo,它不会对脚本进行太多处理,否则如果我遵循数组和其他东西的传统路径,我肯定脚本会崩溃

str_shuffle('1234567890')
可能会给你“3124567890”


str\u shuffle('9876543210')
可能还会给您“3124567890”等。据我所知,str\u shuffle在默认情况下不是唯一的。它只是随机地洗牌字符串。因此,从理论上讲,100万个数字可能都是相同的。

答案显然是否定的

对单个数字的任何修改,如果不考虑所有其他数字,可能会导致重复

随机洗牌就是这样一种修改,因为它只是将数字混合在一个数字中,所以很有可能得到一个重复的数字(任何想计算概率的数学人?期待对此发表一些评论。)

反例:

<?php

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

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

问题的陈述表明,实际上您可能希望洗牌数组元素,而不是那些元素的内容。也许你能够保持唯一性,但通过交换数组元素一段时间,你就可以得到一个随机分布的集合——即用随机元素a和随机元素B交换N次迭代。

你要找的是一个排列脚本,我正好为你准备了

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));
函数置换($str)
{ 
$aStr=str\U分割($str);
$iSize=计数($aStr);
$aResult=array();
对于($i=0;$i<$iSize;++$i)
{ 
$sFirst=阵列移位($aStr);
$aInner=$aStr;
$iInner=计数($aInner);
对于($j=0;$j<$iInner;++$j)
{ 
$aResult[]=$s第一次内爆(“”,$aInner);
$sTmp=数组移位($aInner);
$aInner[]=$sTmp;
} 
$aStr[]=$sFirst;
} 
返回$aResult;
} 
$userinput=“1234567890”;
打印(permuteString($userinput));

这将打印给定userinput变量的所有可能排列

取决于您对“唯一性”的定义

当你说100万组10位数的电话号码时,如果你想对所有号码都使用
str_shuffle
,然后当你说unique时,你的意思是100万个10位数的电话号码中至少有一个在洗牌之前不存在,或者什么?如果是,请看这里:

十!!是3628800。这比一百万大很多。因此,甚至有2/3的几率所有的数字都是随机的


这意味着,如果您对所有数字使用
str_shuffle
,无论您将唯一定义为什么,您都很可能(超过66%的几率)得到一个“唯一”集合。

这不是问题所在。您的意思是它不够清楚。。?它回答了我认为是“否”的问题。我不认为最有可能超过66%的几率,或者至少我不相信66%的几率,如果它们是唯一的这一点很重要的话
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));