首先是要用mt_rand()函数生成指定个数的随机数字;
然后使用array_unique()函数去重;
因为去重了;所以得到的数字就不够指定个数了;
所以;核心是要用while循环;直到得到指定个数的数字;
到这里基本可以是结束了;
对于追求完美的人来说;还可以再用个sort();
目的不是要用来排序;主要是将得到的数组key格式化;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * 生成不重复的随机数 * @param int $start 需要生成的数字开始范围 * @param int $end 结束范围 * @param int $length 需要生成的随机数个数 * @return array 生成的随机数 */ function get_rand_number($start=0,$end=10,$length=4){ $connt=0; $temp=array(); while($connt<$length){ $temp[]=mt_rand($start,$end); $data=array_unique($temp); $connt=count($data); } $data = array_values($data); return $data; } |
实际开发中用到代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
//所有状态正常项目的id编号 $itemIds = Db::name('user_item')->field('id')->where('status', 1)->select(); //假定有17个项目 /* $itemIds = array( array('id' => 1), array('id' => 2), array('id' => 3), array('id' => 4), array('id' => 5), array('id' => 6), array('id' => 7), array('id' => 8), array('id' => 9), array('id' => 10), array('id' => 11), array('id' => 12), array('id' => 13), array('id' => 14), array('id' => 15), array('id' => 16), array('id' => 17) ); */ //降为一维数组 $waitItem = $waitItems = array(); foreach($itemIds as $k => $v){ $waitItem[] = $v['id']; } //按每个服务器最大能执行的数量分割 $waitItems = array_chunk($waitItem, $num); //随机得到所需的服务器 $serverCount = 0; $serverList = $serverLists = $temp = array(); while( $serverCount < count( $waitItems ) ){ $temp[] = mt_rand( 0, count($waitSid)-1 ); $serverList = array_unique( $temp ); $serverCount = count( $serverList ); } $serverLists = array_values( $serverList ); //分配任务并写入分配数据 foreach($waitItems as $k => $v){ $data[] = array( 'sid' => $waitSid[ $serverLists[$k] ], 'items' => serialize($v), 'create_time' => $today ); } if( !empty($data) ){ Db::name('server_task')->insertAll( $data ); } |
转载请注明:PHP笔记 » PHP生成多个不重复的随机数字