手头有个Asp的函数,由于要转到PHP平台,需要将此函数转换成PHP代码:
期盼高手!我调试过程中发现rnd函数的结果是一定的,请注意这点function mistake(preString)
      Dim texts
      Dim seed
      Dim i,length
      Dim lnum, rnum, anum
      prestring = trim(preString)
      length = len(preString)
      seed = length
      Randomize(length)
      texts = ""
      for i = 1 to length
            lnum = asc(mid(preString,i,1))
            rnum = seed*asc(right(prestring,1))
            anum = -lnum-rnum
            seed = int(94*rnd(anum)+32)
            texts = texts & chr(seed) & chr(int(94*rnd(-seed)+32))
      next
dim dist
dist=""
for i = 1 to len(texts)
  if mid(texts,i,1)<>"'"  then
dist=dist+mid(texts,i,1)
       end if
    next 
    mistake = dist
end function

解决方案 »

  1.   

    如果我不在线的话,你可以Q:12733166 联系我
    只要解决问题,马上结贴。
    如果能告诉我Asp的Rnd函数的内部实现逻辑,也可以,我自己实现PHP代码。
      

  2.   

    在Php实现随机数生成,就是用mt_rand函数或者是rand函数,一个函数就可以了,还有PHP用那两个函数是不会一定的,ASP可能是第一个随机数是一定的 (根据VB的第一个随机数是一定的,第二个才不是)。
      

  3.   

    Php不需要定义变量(就是DIM那些),然后FOR循环和IF语句,在PHP实现就像C语言那样,这样就可以转换了
      

  4.   

    感谢楼上的回复,如果你手头有环境的话你可以测试一下
    Asp代码给相同的参数,结果不会变;但是PHP的rand或mt_rand每次都不一样
    所以相同参数,但结果却不一样
      

  5.   

    我把Asp手册的Rnd函数贴出来,请注意我标红的地方。
    Rnd[(number)]
    number 参数可以是任意有效的数值表达式。说明
    Rnd 函数返回一个小于 1 但大于或等于 0 的值。 number 的值决定了 Rnd 生成随机数的方式:
    如果 number 为 Rnd 生成 
    小于零 每次都相同的值,使用 number 作为种子。 
    大于零 序列中的下一个随机数。 
    等于零 最近生成的数。 
    省略 序列中的下一个随机数。 
    因每一次连续调用 Rnd 函数时都用序列中的前一个数作为下一个数的种子,所以对于任何最初给定的种子都会生成相同的数列。在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有基于系统计时器的种子。要产生指定范围的随机整数,请使用以下公式: Int((upperbound - lowerbound + 1) * Rnd + lowerbound)这里, upperbound 是此范围的上界,而 lowerbound 是此范围内的下界。
      

  6.   

    我自己写了一份,但是PHP出来的结果总是变的,而Asp就不变function mistake($prestring) {
      $prestring = trim($prestring);
      $length = strlen($preString);
      $seed = $length ;
      $texts = "";
      
      for( $i=0;$i<=$length;$i++ ) {
    $seed = intval(94 * rand( 0,ord(substr($prestring, i, 1)) - $seed * ord(substr($prestring, -1,1))) + 32) ;
    // rand( 0,ord(substr($prestring, i, 1) 这个 rand 和你的要求不一样~~他是返回 一到 ord() 中的任何一个数,暂时不知如何解决...
    $texts = $texts.chr($seed).chr(intval(94 * rand(0,$seed) + 32)) ;  //哎...还是 rand 这!!!
    }
    $dist = "" ;
    for($a=0;$a<=strlen($texts);$a++) {
    if( substr($tests,$i,1)!="'" ) {
    $dist = $dist.substr($texts, $i, 1);
    }


    $mistake = $dist;  
    return  $mistake;
    }
      

  7.   

    您没有翻译 Randomize 当然就不对啦
    VBS:
    Randomize 语句
    初始化随机数生成器。Randomize [number]number 参数可以是任何有效的数值表达式。PHP:
    void srand ( [int seed] )用 seed 播下随机数发生器种子。从 PHP 4.2.0 版开始,seed 参数变为可选项,当该项为空时,会被设为随时数。
      

  8.   

    谢谢唠叨大哥的回复,不知道怎么联系你?我的Q:12733166
    php中rand是两个参数的,min和max,
    我又写了一份:
    function mistaked($prestr) {
      $prestr = trim($prestr);
      $length = strlen ($prestr);
      $seed = $length;
      srand($length);
      $texts = "";
      
      for( $i=0;$i<$length;$i++ ) {
       $lnum = ord(substr($prestr,$i,1));
    $rnum = $seed*ord(substr($prestr,-1));
    $anum = -$lnum-$rnum;
    echo "$lnum + $rnum : $anum <br/>";
    $seed = (int)(94*rand($anum, 0)/$anum+32);
    echo $seed ."<br/>";
    //$seed = intval(94 * rand( 0,ord(substr($prestr, $i, 1)) - $seed * ord(substr($prestr, -1,1))) + 32) ;
    $texts = $texts.chr($seed).chr(intval(94 * rand($seed, 0)/$seed + 32)) ;
    }
    $dist = "" ;
    for($a=0;$a<=strlen($texts);$a++) {
    if( substr($tests,$a,1)!="'" ) {
    $dist = $dist.substr($texts, $a, 1);
    }
    }

    return $dist;
    }
      

  9.   

    echo $seed ."<br/>";
    这里调试,显示的结果和Asp还是不一样,哪位高手帮忙给看看
      

  10.   

    你直接说想要一个怎样的函数,输入什么,输出什么.
    这样还比强行ASP转PHP快,没多少人想看代码改的=_=
      

  11.   

    楼主莫非是想用php实现asp的rnd函数(结果是一定的)
      

  12.   

    要求随机的结果一定,并且和asp的一样?
      

  13.   

    感谢楼上几位的回复:
    我现在的问题是这样的,我们以前的系统是Asp的,上面的函数是密码算法,这个算法是不可逆的;
    现在系统要升级为PHP的,数据不能动,所以想用PHP实现上述算法。
    现在的问题关键就在这个rand函数上,别的都好模拟,就是这个还没有实现,我也想过查过Asp中Rnd函数的实现机制,没有找到。
    苦闷啊!从几位的回复中我也能体会到,很少有人单步调试程序,估计很多人都是走马观花看一眼,觉得代码简单就不看了。(不够认真^_^)继续等待高手中
      

  14.   

    php的rand函数应该跟c一样。
    asp的rnd函数应该vb里面的一样。