程序员人生 网站导航

php生成多个不重复的随机数实例程序

栏目:php教程时间:2014-05-16 08:01:08

在php中生成随机数据直接使用mt_rand就可以实现了,如果要生成不重复随机数我们可以使用 unique_rand 函数了,实例代码如下:

  1. <?php  
  2. //range 是将1到100 列成一个数组  
  3. $numbers = range (1,100);  
  4. //shuffle 将数组顺序随即打乱  
  5. shuffle ($numbers);  
  6. //array_slice 取该数组中的某一段  
  7. $no=6;  
  8. $result = array_slice($numbers,0,$no);  
  9. for ($i=0;$i<$no;$i++){  
  10. echo $result[$i]."<br>";  
  11. }  
  12. print_r($result);  
  13. ?> 
  14. //range 是将1到42 列成一个数组  
  15. $numbers = range (1,42);  
  16. //shuffle 将数组顺序随即打乱  
  17. shuffle ($numbers);  
  18. //array_slice 取该数组中的某一段  
  19. $result = array_slice($numbers,0,3);  
  20. print_r($result); 

实例代码二如下:

  1. <?php  
  2. $numbers = range (1,20);  
  3. srand ((float)microtime()*1000000);  
  4. shuffle ($numbers);  
  5. while (list (, $number) = each ($numbers)) {  
  6. echo "$number ";  
  7. }  
  8. ?> 

实例代码三,用PHP,在1-20间随机产生5个不重复的值,代码如下:

  1. <?php  
  2. function NoRand($begin=0,$end=20,$limit=5){  
  3. $rand_array=range($begin,$end);  
  4. shuffle($rand_array);//调用现成的数组随机排列函数  
  5. return array_slice($rand_array,0,$limit);//截取前$limit个  
  6. }  
  7. print_r(NoRand());  
  8. ?> 

或者不shuffle的话,代码如下:

  1. <?php  
  2. $tmp=array();  
  3. while(count($tmp)<5){  
  4. $tmp[]=mt_rand(1,20);  
  5. $tmp=array_unique($tmp);  
  6. }  
  7. print join(',',$tmp);  
  8. ?> 

上面都是纸上谈兵了,下面来真实的了,要求如下:

有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次,前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空,那么你会如何填补这个漏子?

当然向上级反映情况,但是我们这里讨论的是技术,就是需要生成1-25之间的16个不重复的随机数,去填补,具体怎么设计函数呢?将随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数,代码如下:

  1. <?php 
  2. /* 
  3. * array unique_rand( int $min, int $max, int $num ) 
  4. * 生成一定数量的不重复随机数 
  5. * $min 和 $max: 指定随机数的范围 
  6. * $num: 指定生成数量 
  7. */ 
  8. function unique_rand($min$max$num) { 
  9.     $count = 0; 
  10.     $return = array(); 
  11.     while ($count < $num) { 
  12.         $return[] = mt_rand($min$max); 
  13.         $return = array_flip(array_flip($return)); 
  14.         $count = count($return); 
  15.     } 
  16.     shuffle($return); 
  17.     return $return
  18. $arr = unique_rand(1, 25, 16); 
  19. sort($arr); 
  20. $result = ''
  21. for($i=0; $i < count($arr);$i++) 
  22.  $result .= $arr[$i].','
  23. $result = substr($result, 0, -1); 
  24. echo $result
  25. ?> 

程序运行如下:1 2,3,4,6,7,8,9,10,11,12,13,16,20,21,22,24

补充几点说明:

•生成随机数时用了 mt_rand() 函数。这个函数生成随机数的平均速度要比 rand() 快四倍。

•去除数组中的重复值时用了“翻翻法”,就是用 array_flip() 把数组的 key 和 value 交换两次。这种做法比用 array_unique() 快得多。

•返回数组前,先使用 shuffle() 为数组赋予新的键名,保证键名是 0-n 连续的数字。如果不进行此步骤,可能在删除重复值时造成键名不连续,给遍历带来麻烦。

再看一个实例:生成0-z这36个字符中的一个。每次调用 getOptions() 方法生成一个字符,它们的存储如下:array[0] = 0, array[1] = 1, ……, array[35] = z,代码如下:

  1. Array (  
  2.  [0] => 0  
  3.  [1] => 1  
  4.  [2] => 2  
  5.  [3] => 3  
  6.  [4] => 4  
  7.  [5] => 5  
  8.  [6] => 6  
  9.  [7] => 7  
  10.  [8] => 8  
  11.  [9] => 9  
  12.  [10] => a  
  13.  [11] => b  
  14.  [12] => c  
  15.  [13] => d  
  16.  [14] => e  
  17.  [15] => f  
  18.  [16] => g  
  19.  [17] => h  
  20.  [18] => i  
  21.  [19] => j  
  22.  [20] => k  
  23.  [21] => l  
  24.  [22] => m  
  25.  [23] => n  
  26.  [24] => o  
  27.  [25] => p  
  28.  [26] => q  
  29.  [27] => r  
  30.  [28] => s  
  31.  [29] => t  
  32.  [30] => u  
  33.  [31] => v  
  34.  [32] => w  
  35.  [33] => x  
  36.  [34] => y  
  37.  [35] => z  

然后在0-35之间随机生成一个数作为索引,其实就是在上面数组中随机取出一个数,作为变量 $result 中的第一个字符,这个随机索引随后会被赋值成数组最后一个,它将不会参与下一轮的随机选取,代码如下:

  1. <?php 
  2. // 生成0123456789abcdefghijklmnopqrstuvwxyz中的一个字符 
  3. function getOptions() 
  4.   $options = array(); 
  5.   $result = array(); 
  6.   for($i=48; $i<=57; $i++) 
  7.   { 
  8.       array_push($options,chr($i));   
  9.   } 
  10.   for($i=65; $i<=90; $i++) 
  11.    { 
  12.        $j = 32; 
  13.        $small = $i + $j
  14.        array_push($options,chr($small)); 
  15.  } 
  16.   return $options
  17. /* 
  18. $e = getOptions(); 
  19. for($j=0; $j<150; $j++) 
  20. { 
  21.  echo $e[$j]; 
  22. } 
  23. */ 
  24. $len = 10; 
  25. // 随机生成数组索引,从而实现随机数 
  26. for($j=0; $j<100; $j++) 
  27.   $result = ""
  28.   $options = getOptions(); 
  29.   $lastIndex = 35; 
  30.   while (strlen($result)<$len
  31.   { 
  32.     // 从0到35中随机取一个作为索引 
  33.   $index = rand(0,$lastIndex); 
  34.   // 将随机数赋给变量 $chr 
  35.     $chr = $options[$index]; 
  36.   // 随机数作为 $result 的一部分 
  37.     $result .= $chr
  38.     $lastIndex = $lastIndex-1; 
  39.   // 最后一个索引将不会参与下一次随机抽奖 
  40.     $options[$index] = $options[$lastIndex]; 
  41.   } 
  42.   echo $result."n"
  43. ?>
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐