时间一到再加100分如:字符:0-9
长度:1
那就生成0,1,2,3,4,5,6,7,8,9
长度:2,就会生成00-99现在要求字符可以包括a-z,或者其他特殊符号,求一高效的生成算法。

解决方案 »

  1.   


    //现在要求字符可以包括a-z,或者其他特殊符号,求一高效的生成算法。
    //可以参考下面代码
    $input = array("A", "B", "C", "D", "E");
    $rand_keys = array_rand($input, 1);
    echo $input[$rand_keys[0]] . "\n";//字符:0-9 
    //长度:1
    $key = rand(0,9);
     
    //那就生成0,1,2,3,4,5,6,7,8,9 
    //长度:2,就会生成00-99 
    $key1 = rand(0,9);
    $key2 = rand(0,9);
    $key = $key1.$key2;
      

  2.   

    递归运行效率绝对比循环语句运行效率低,不要认为代码少,效率就高(教材上是这么说的,呵呵)。
    我这个代码也少,使用字符串函数很轻易达到目的,效率是不是最高不敢说:<?php
    function get_string($n){
    $source='0123456789abcdefghijklmnopqrstuvwxyz';//如果你还想要什么特殊字符请尽管加到里面去
    $len=strlen($source);
    for($str="";strlen($str)<$n;$str.=$source{rand(0,$len-1)});
    return $str;
    }echo get_string(6);//测试
    ?>
      

  3.   


    <?php
    function gene_dic($n){
    $source='0123456789abcdefghijklmnopqrstuvwxyz';//如果你还想要什么特殊字符请尽管加到里面去
    $len=strlen($source);//得到源字串的长度
    $count=1;
    for($i=0;$i<$n;$i++){//通过循环先得到词典总词数和一个以字长度为下标的数组,数组初始化为(0,…,0)
      $count*=$len;//总词数等于源字串长度的n次方,奶奶的,php没有幂运算。
      $series[]=0;
      }
    for($i=0;$i<$count;$i++){//开始循环造词,一次循环造一个词,称为“大循环”
      $word='';//词初始化为空字符串
      for($no=$n-1;$no>=0;$no--){//循环遍历数组每次从源字串中取一个字符,为便于进位运算,取字符是从后往前取
        $word=$source{$series[$no]}.$word;//先取出一个字符
            //取出一个字符后就要判断当前数组元素如何如果改变值,为下一次“大循环”做准备
        if($no==$n-1){//末位的判断,它比较特殊,每次大循环都要增值
          if($series[$no]==$len-1){
            $series[$no]=0;
        $tonext_value=1;//归零时就进位
       }else{
        $series[$no]+=1;
        $tonext_value=0;//未归零就增值,不进位
           }
    }elseif($no<$n-1){//中间位的进位判断
      $series[$no]+=$tonext_value;//先取得上一位的进位值
      if($series[$no]==$len){
           $series[$no]=0;
    $tonext_value=1;//归零了就继续进位
      }else{
      $tonext_value=0;//不归零就不进位
      }
    }else{
    $series[$no]+=$tonext_value;//大循环次数决定了“老大”是只进不出的。
    }
      }
    echo "$word ";//输入单词
    }
    }
    gene_dic(2);//测试,结果OK。高手可能有更好的进位算法,菜鸟请大家多多指教。
    ?>
      

  4.   

    优化了进位算法:<?php
    function gene_dic($n){
    $source='0123456789abcdefghijklmnopqrstuvwxyz';
    $len=strlen($source);
    $count=1;
    for($i=0;$i<$n;$i++){
      $count*=$len;
      $series[]=0;}
    for($i=0;$i<$count;$i++){
      $word='';
      $tonext_value=1;//小循环前设好给末位进位
      for($no=$n-1;$no>=0;$no--){ 
        $word=$source{$series[$no]}.$word;
    $series[$no]+=$tonext_value;
        if($no>0){
      if($series[$no]==$len){
           $series[$no]=0;
    $tonext_value=1;
        }else{
        $tonext_value=0;
        } } }
    echo "$word ";
    }
    }
    gene_dic(2);
    ?>
      

  5.   

    function get_string($strlen){
            $source='0123456789'; //任意字符
            $len = strlen($source); //长度
            $return = array();
            for($i = 0 ;$i < $len;$i++){
                for($j = 0;$j < $strlen;$j++){
                    $return[$i] .= $i;
                }
            }
            return implode(',', $return);
    }
    如果输入长度2: 输出结果就是:
    00,11,22,33,44,55,66,77,88,99
    不知道是不是你要的结果
      

  6.   

    不好意思 搞错
    应该是:
    function get_string($strlen){
            $source='0123456789';
            $len = strlen($source);
            $return = array();
            for($i = 0 ;$i < $len;$i++){
                for($j = 1;$j <= $strlen;$j++){
                    $return[$i] .= substr($source,$i,1);
                }
            }
            return implode(',', $return);
        }
      

  7.   

    排列组合的问题,算法不少。
    建议多google,根据自己的数据量选择相应的算法。