200分求一PHP算法,字典生成 时间一到再加100分如:字符:0-9长度:1那就生成0,1,2,3,4,5,6,7,8,9长度:2,就会生成00-99现在要求字符可以包括a-z,或者其他特殊符号,求一高效的生成算法。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //现在要求字符可以包括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; 递归运行效率绝对比循环语句运行效率低,不要认为代码少,效率就高(教材上是这么说的,呵呵)。我这个代码也少,使用字符串函数很轻易达到目的,效率是不是最高不敢说:<?phpfunction 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);//测试?> <?phpfunction 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。高手可能有更好的进位算法,菜鸟请大家多多指教。?> 优化了进位算法:<?phpfunction 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);?> 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不知道是不是你要的结果 不好意思 搞错应该是: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); } 排列组合的问题,算法不少。建议多google,根据自己的数据量选择相应的算法。 小弟实在没有思路如何做 cakePHP下的文件出现乱码 php访问问题 PHP保存问题 关于FTP的帐号,不是很明白 页面能自适应手机屏幕大小,在里面的图片不能 ob函数怪现象,怎样使用回掉函数而使implicit_flush功能不致失效? 怎么样让查询出来的结果分页显示啊? php有没有创建文本文件或别的什么函数啊.还有相应的读取函数. 为什么我的php+iis8.5二级域名不能共享主域名的session 求助discuz 开发手册一份 自动调整屏幕显示比例
//现在要求字符可以包括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;
我这个代码也少,使用字符串函数很轻易达到目的,效率是不是最高不敢说:<?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);//测试
?>
<?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。高手可能有更好的进位算法,菜鸟请大家多多指教。
?>
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);
?>
$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
不知道是不是你要的结果
应该是:
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);
}
建议多google,根据自己的数据量选择相应的算法。