0

假设我有 100 万个 10 位唯一数字。如果我对 100 万个数字中的每一个都进行一次 str_shuffle ,是否仍会保持唯一性????请建议


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

4

7 回答 7

6

不。

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

str_shuffle('9876543210')也可能会给你“3124567890”等。

于 2010-11-22T16:03:11.307 回答
3

很明显,答案是否定的。

对不关心所有其他数字的单个数字的任何修改都可能导致重复。

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

于 2010-11-22T16:07:28.823 回答
1

问题陈述表明您实际上可能希望打乱数组元素,而不是这些元素的内容。也许您可以保持唯一性,但通过交换数组元素一段时间来获得一个随机分布的集合 - 即将随机元素 A 与随机元素 B 交换 N 次迭代。

于 2010-11-22T16:51:12.837 回答
1

据我所知,str_shuffle 默认不是唯一的。它只是随机打乱字符串。从理论上讲,所有 100 万个数字都可能相同。

于 2010-11-22T16:03:53.020 回答
1

反例:

<?php

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

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

我有:

011
011
于 2010-11-22T16:08:26.693 回答
1

您正在寻找的是一个排列脚本,我恰好为您准备了它。

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

这将打印给定用户输入变量的所有可能排列。

于 2010-12-31T06:03:56.200 回答
0

取决于您将“独特性”定义为什么。

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

10!是 3628800。这比 100 万大很多。所以甚至有三分之二的机会所有的数字都是随机的。

这意味着,如果您str_shuffle在所有数字上使用,您很可能(超过 66% 的机会)得到一个“独特”的集合,无论您将独特定义为什么。

于 2012-09-29T07:38:53.833 回答