如何在PHP中生成具有3位数字且每个数字没有双数的唯一数字

克里斯蒂安·伊盖

我想在 120 对中生成 3 位数字 没有重复和重复的数字 示例:012013、132 是有效的 011333、022202210是无效的注意:012并且210是冗余数字都出现因此它是无效的

我正在使用 PHP 版本 5.6.28 Apache/2.4.23 (Win32) OpenSSL/1.0.2h PHP/5.6.28 这是我到目前为止尝试过的但没有运气。

数计数:120 027 028 029 036 038 046 069 074 079 093 105 106 109 123 143 145 149 152 153 162 167 175 182 195 198 204 208 213 216 217 219 235 243 275 287 294 301 302 310 327 341 342 347 352 357 358 365 369 376 378 380 384 392 402 408 415 423 428 431 453 465 467 468 490 493 496 506 509 510 512 524 537541 561 573591 597 598 609 629 631 634 639 647 689 691 694 697 703 719 723 743 745 750 752 759 761 813 819 820 824 829 840 865 875 890 905 907 912 916 917 921 930 941 945 947 963 965 973 984

注意这里537573无效

/*----Numbers.php----*/

class Numbers{
    private $num_set = array();//get 3 digit
    private $num_basket = array(); //container
    public $codeNum = "0123456789";


    public function get_basket(){
        return $this->num_basket;
    }
    public function put_basket($num){
        $this->num_basket[] = $num;
    }

    public function is_exist($num_taken){
        if(in_array($num_taken, $this->num_basket)){
            return true;
        }else{
            return false;
        }        
    }

    public function generate_num(){
        while(count($this->num_set) < 3){
            $get_one_digit = $this->getToken(1);
            if(!in_array($get_one_digit, $this->num_set)){
                $this->num_set[] = $get_one_digit;

            }
        }
        $three_digit = implode($this->num_set);
        $this->num_set = array();
        return $three_digit;
    }

    protected function getToken($length)
    {
        $token = "";

        $max = strlen($this->codeNum); // edited

        for ($i=0; $i < $length; $i++) {
            $token .= $this->codeNum[$this->crypto_rand_secure(0, $max-1)];
        }   
        return $token;
    }

    //generate code
    protected function crypto_rand_secure($min, $max)
    {
        $range = $max - $min;
        if ($range < 1) return $min; // not so random...
        $log = ceil(log($range, 2));
        $bytes = (int) ($log / 8) + 1; // length in bytes
        $bits = (int) $log + 1; // length in bits
        $filter = (int) (1 << $bits) - 1; // set all lower bits to 1
        do {
            $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
            $rnd = $rnd & $filter; // discard irrelevant bits
        } while ($rnd > $range);
        return $min + $rnd;
    }
}

/*----- index.php ---*/

include("Numbers.php");
$num = New Numbers;

for($i=0;$i<120;$i++){
    $num_item = $num->generate_num();
    while($num->is_exist($num_item) == true){
        $num_item = $num->generate_num();
    }

    $num->put_basket($num_item);
}

$num_basket = $num->get_basket();
if(!empty($num_basket)){
    print "number count: ".count($num_basket)."<br>";
    sort($num_basket);
    foreach($num_basket as $item){
        print $item[0].$item[1].$item[2]." ";
    }

}

代码工作正常,没有显示错误,但没有显示预期的结果。我真的需要帮助。我将不胜感激任何帮助。

Nigel Ren

我已经重写了代码,因为我认为类和类外的代码有太多组合,这会产生很多依赖(恕我直言)。

在这段代码中,您创建了一个类并说明要生成多少个数字,然后调用该generate()方法为您完成所有工作。

为了检查之前是否使用过这些数字,我将数字编码为一个位字段并将其存储(该encode()方法只是根据使用的数字添加二进制数)。如果同样的模式再次发生,它只会尝试另一个。

class NumberGenerator{
    private $numbersUsed = [];
    private $basket = [];
    private $numbersToGenerate = 0;

    public function __construct( int $numbersToGenerate )   {
        $this->numbersToGenerate = $numbersToGenerate;
    }

    public function generate(){
        $numbers = range(0,9);
        for ( $i = 0; $i < $this->numbersToGenerate; $i++ ) {
            do    {
                shuffle($numbers);
                $number = array_slice($numbers, 0,3);
                $encoded = $this->encode($number);
            }
            while ( in_array($encoded, $this->numbersUsed) );
            $this->basket[] = implode($number);
            $this->numbersUsed[] = $encoded;
        }

        return $this->basket;
    }

    protected  function encode(array $num)  {
        $numbers = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512];
        $sum = 0;
        foreach ( $num as $digit )  {
            $sum += $numbers[$digit];
        }
        return $sum;
    }
}

$generator = new NumberGenerator(120);
print_r($generator->generate());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何生成不以0开头且具有唯一数字的随机4位数字?

正则表达式查找具有唯一数字的数字

如何获得具有最大数字和唯一键的String的每个数组?

如何在C#中生成具有3个字母和6个数字的随机字母数字数组?

如何在Python中有效地生成仅包含唯一数字的随机数?

如何在python中生成随机但唯一的数字?

检查字符串是否仅是数字,或者是否在至少一位数字之后且在句号之后最多包含3个数字是否具有小数点

匹配具有唯一数字的字母数字词(非数字词)

如何用C ++从数字列表中生成3位数字?

对于每个像元,从1开始获取一个二维数组,该数组包含所有可能的唯一数字组合,且每个数字的组合都低于混合数字

给定一个数字,找到下一个更大的数字,该数字具有唯一数字,但0和2

我无法通过打印具有指定范围内唯一数字的所有3位数字来理解逻辑

Python 3-递归查找有无唯一数字的n位代码

如何生成8位数字的唯一标识符以替换python pandas中的现有标识符

对具有内存限制的唯一数字进行排序

生成范围(1,2,3 ... 99; 1,2,3 ... 99;)的唯一数字系列,没有重复

根据一个数字序列生成一个伪唯一数字(代码),该数字在4位数字之内没有重复

以20位数字的间隔生成唯一且可逆的ID

VBA-在代码中生成唯一数字

生成一个小于4位数字的随机数,但它具有1位,2位或3位数字的概率相等

随机选择一个5位数字,然后分别选择每个数字有什么区别?

如何在PHP中生成唯一范围的数字

在数组中生成唯一数字

如何在 oracle 表中生成 1 到 10 百万之间的 5% 唯一数字?

有没有办法在python中生成唯一的数字?

生成具有 3 个唯一数字的数组

如何在 Python 中生成带有 4 位字符串和 4 位数字的随机代码?

VBA - 具有唯一数字的方程

如何获得只有唯一数字的列表?(Python)