干脆的,直接上代码
define('ROUNDS', 1e5);//参考,1000, 10000 ……
$krr = array();for($i=0;$i<ROUNDS;++$i){
$id = rand(1, 200000000);
if(isset($krr[$id])){
continue;
}
$krr[$id] = TRUE;
}
echo PHP_INT_MAX, DIRECTORY_SEPARATOR, PHP_VERSION, "\n", ROUNDS, '=>', sizeof($krr);
这段代码的结果,没想明白方便的,麻烦测一下,贴结果,,,

解决方案 »

  1.   

    结果是: 2147483647\5.3.5 100000=>32768
    int rand ([ int $min ], int $max )
    rand() 返回 0 到 RAND_MAX 之间的伪随机整数。
    在某些平台下(例如 Windows)RAND_MAX 只有 32768。
    详情见手册
      

  2.   


    echo rand(1, 200000000);很少有机会能输出少于2^15的数字,,可以随意测一下如果我没理解错误的话另外,可以
    define('ROUNDS',    32769);//结果一样
      

  3.   

    刚测试了下,getrandmax()在windows下得到的结果是32767。貌似这里限定rand()的min和max没有起到作用。
    改用mt_rand的话,结果可能更大。
      

  4.   

    要是直接 echo rand(1, 200000000);
    可以得到大于32768 的数,估计是最多只能随机发生32768次
    用mt_rand(1, 200000000)次数会多些
      

  5.   

    确实是这样子附新的测试代码如下:define('ROUNDS', 35000);//参考,1000, 10000 ……
    $krr = array();for($i=0;$i<ROUNDS;++$i){
    $id = rand(1, 200000000);
    if(isset($krr[$id])){
    $tmp = 0;
    foreach($krr AS $v){
    if($v === $id){
    echo "$tmp  \n";
    break;
    }
    ++$tmp;
    }
    }
    $krr[$id] = $id;
    }
    上面的代码输出,吊诡的地方在于,输出是依照顺序增加的,依此,再写一段测试代码
    for($i=0;$i<100;$i++){
    echo fun_rand(1, 10000), "\n";/////这里输出每次都一样,hohoho~~~~~~
    }function fun_rand($min, $max){
    $res = rand($min, $max);
    for($i=0;$i<32767;$i++) rand($min, $max);
    return $res;
    }
    今天没时间了,感谢大家,回头再查一下源码
      

  6.   

    本帖最后由 xuzuning 于 2011-12-20 19:27:26 编辑