function word($txt){
$words=file_get_contents($txt);
$wordsarr=explode("\r\n",$words);
$j=count($wordsarr);
$key=rand(0, $j);
return trim($wordsarr[$key]);
}$str1=word('words/1.txt');
$str2=word('words/1.txt');
$str3=word('words/1.txt');$title=$str1."_".$str2."_".$str3."\r\n";
file_put_contents("1.txt",$title,FILE_APPEND);声明:1.txt有3200行我用此种方法进行随机组合,居然在组合不到30个左右,会连着不停的重复,因为我时候插入到Mysql表里的 title字段唯一属性请问这个哪里的问题 为什么会这样啊  3200个不同的值 这样组合没这么大的重复率啊 在这还是连续重复

解决方案 »

  1.   

    先确认你 1.txt 中没有重复行
      

  2.   

    跟踪一下$j=count($wordsarr);后$j的值
      

  3.   

    我只是想说,你这每生成一次要对words/1.txt作3次全文读操作,效率太低了
      

  4.   

    模拟一下你的过程$n = 3200;
    $a = array();
    for($i=0; $i<10000; $i++) {
      $t = rand(0, $n) .'_'. rand(0, $n) .'_'. rand(0, $n);
      if(in_array($t, $a)) break;
      $a[] = $t;
    }
    echo $i;输出 10000
    当 $n < 103 时才会出现重复所以重复应出现在 1.txt 中
      

  5.   

    试出来的
    $n = 3200 是因为你说 1.txt有3200行
    代码模拟了你随机生成串的过程
    如果原始数组不重的话,那么
    rand(0, $n) 不重 则取出的数据也不会重当 $n < 103 时,循环会提前跳出
    输出的是小于 10000 的随机数字
      

  6.   

    这个103开始重复的BUG 可以避免吗 
      

  7.   

    那你误会了!
    我的测试代码用于是判断你的算法是否会出现问题的
    经测试对于 3200 行数据,以3个 rand(0, 3200) 为一组组成串。在 1 万次循环中不会出现重复串
    由此得出你的 1.txt 中有重复行的结论由于你生成的串是要回写到原文件中去的
    因此行数并不是固定在 3200 行的,那么情况就要复杂多了
    当行数小于 103 时是必然要产生重复的
    你或许可以先预置大于103行内容你每次的操作实际上是要将文件全部读取到数组中的
    那么你可以模仿 #5 的代码在写入前先判断一下
      

  8.   

    你误会了 我读取和写入不是在一个1.txt