<?php
/*
 * 从100组重复的数中选50组随机组合,最后移除数组中重复的值,输出
 */    $hund = array('00','01','10','02','20','03','30','04','40','05','50','06','60','07','70','08','80','09','90','11','12','21','13','31','14','41','15','51','16','61','17','71','18','81','19','91','22','23','32','24','42','25','52','26','62','27','72','28','82','29','92','33','34','43','35','53','36','63','37','73','38','83','39','93','44','45','54','46','64','47','74','48','84','49','94','55','56','65','57','75','58','85','59','95','66','67','76','68','86','69','96','77','78','87','79','97','88','89','98','99');
    $all_num = array();
    for($i = 0; $i <1000;$i ++)  //把1000改成任意大于500的数,最后输出的结果都只有476个元素 
     {  $arr = array();
  for($n = 0; $n < 50; )
  {
  $rand = $hund[rand(0,99)];
  if(in_array($rand,$arr))//判断是否有重复的值
  {
  $num = '';
  continue;
  }else{
  $n ++;
  $arr[] = $rand;
  }
  }
  foreach($arr as $val)
  {
  $num .= ' '.$val.' '; 将五十组输组合成一个字符串
  } $arr = array();
$all_num[] = $num; //将$num赋给数组$all_num[] 
$rand = '';
         $num = '';
 }
  $result = array_unique($all_num);//去除重复的值
  print_r($result);//输出结果,为什么每次都只有476个元素??????
?>

解决方案 »

  1.   

    将for($n = 0; $n < 50;)
    改为:
    for($n = 0; $n < 50; $n++)
    下面sele中的$n++注释掉
      

  2.   

    楼主应该将最外层循环中$i ++的提出来,并且楼主也应该在$all_num[] = $num;加个in_array()判断,不过1000此循环很耗时,100次循环倒是挺快
      

  3.   

    如:
    if(!in_array($num, $all_num)){
    $i ++;
    $all_num[] = $num;
    }
      

  4.   

    经测试,99% 为 476个元素。这是不应该的。
    估计是 rand 函数的问题,虽说已经不需要播种了,但至少还是表现出规律性改成这样就是 1000 个元素了$all_num = array();
    for($i = 0; $i <1000;$i ++) {
      shuffle($hund);
      $arr = array_slice($hund, 50);
      
      $all_num[] = join(' ' , $arr);   
    }$result = array_unique($all_num);//去除重复的值
    echo count($result);
    //  print_r($result);//输出结果,为什么每次都只有476个元素??????
      

  5.   

    $hund = $all_num = array();
    for($i = 0; $i < 10000; $i ++)$hund[] = $i;//一定范围内,这个数越大,下面速度越快,因为出现重复的次数变小了,省去了重复再重复的可能了for($i = 0; $i < 1000;){
    $arr = array();
    for($n = 0; $n < 50; $n ++){
    $rand = $hund[rand(0, 9999)];
    while(in_array($rand, $arr))$rand = $hund[rand(0, 9999)];
    $arr[] = $rand;
    } $num = '';
    foreach($arr as $val)$num .= ' '.$val.' '; if(!in_array($num, $all_num)){
    $i ++;
    $all_num[] = $num;
    }
    }
    echo count(array_unique($all_num)).'<br>';
    echo '<pre>';print_r($all_num);
      

  6.   


    这样好像是只是把数组$hund打乱了,然后截取五十个 放到数组里面,比较的时候去除重复元素的时候,比如1 2 3 和 3 2 1 会当做不同元素,这样就不符合要求了,我没说清楚,要求是每组数中至少有一个不相同的数。