假设我有一百万个10位数的唯一数字。如果我为100万个数字中的每一个做一个str_shuffle,它的唯一性是否仍然保持?请建议
谢谢你们一些清晰,但问题仍然存在。实际上,我所说的百万个nos都是唯一的数字(实际上它们是10位数的移动号码)。我想给这些客户提供这些百万美元但是我不希望他们有实际的数字。因此,我需要随机化每个数字并生成一个等效的10位数唯一数字,我可以给客户端,并保持我的数据库中的映射。我正在寻找总和算法,而不是为脚本做很多处理,否则我确信如果我遵循传统的数组和东西的路径,脚本将会崩溃
答案 0 :(得分:7)
没有
str_shuffle('1234567890')
可能会给你“3124567890”。
str_shuffle('9876543210')
也可能会给你“3124567890”等等。
答案 1 :(得分:4)
很明显答案是肯定的。
对不关心所有其他数字的单个数字的任何修改都可能导致重复。
随机改组是一种修改,因为它只是将数字混合在一个数字中,所以很有可能获得重复(那里有任何数学家想要计算概率?期待对此有一些评论。)
答案 2 :(得分:2)
答案 3 :(得分:2)
反例:
<?php
$unique_numbers = array('101', '110');
foreach($unique_numbers as $number){
echo str_shuffle($number) . PHP_EOL;
}
我得到了:
011
011
答案 4 :(得分:2)
问题陈述表明你实际上可能希望改组数组元素,而不是那些元素的内容。也许你能够保持唯一性但通过交换数组的元素一段时间来随机分布 - 即交换随机元素A和随机元素B进行N次迭代。
答案 5 :(得分: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变量的每个可能的排列。
答案 6 :(得分:1)
取决于您将'uniqueness'定义为。
当你说100万套10位数字时,如果你想在所有这些数字上使用str_shuffle
,然后当你说唯一时,你的意思是100万个10位数中的至少1个洗牌前电话号码不存在或者什么?如果是这样,请看这里:
10!是3628800.这大大超过了100万。因此,即使是三分之二的机会,所有数字都是随机的。
这意味着,如果您对所有数字使用str_shuffle
,则无论您定义的是什么,最有可能(超过66%的机会)获得“唯一”设置。