国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

php生成多個(gè)不重復(fù)的隨機(jī)數(shù)實(shí)例程序

2024-05-04 21:57:02
字體:
供稿:網(wǎng)友

在php中生成隨機(jī)數(shù)據(jù)直接使用mt_rand就可以實(shí)現(xiàn)了,如果要生成不重復(fù)隨機(jī)數(shù)我們可以使用 unique_rand 函數(shù)了,實(shí)例代碼如下:

  1. <?php  
  2. //range 是將1到100 列成一個(gè)數(shù)組  
  3. $numbers = range (1,100);  
  4. //shuffle 將數(shù)組順序隨即打亂  
  5. shuffle ($numbers);  
  6. //array_slice 取該數(shù)組中的某一段  
  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 列成一個(gè)數(shù)組  
  15. $numbers = range (1,42);  
  16. //shuffle 將數(shù)組順序隨即打亂  
  17. shuffle ($numbers);  
  18. //array_slice 取該數(shù)組中的某一段  
  19. $result = array_slice($numbers,0,3);  
  20. print_r($result); 

實(shí)例代碼二如下:

  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. ?> 

實(shí)例代碼三,用PHP,在1-20間隨機(jī)產(chǎn)生5個(gè)不重復(fù)的值,代碼如下:

  1. <?php  
  2. function NoRand($begin=0,$end=20,$limit=5){  
  3. $rand_array=range($begin,$end);  
  4. shuffle($rand_array);//調(diào)用現(xiàn)成的數(shù)組隨機(jī)排列函數(shù)  
  5. return array_slice($rand_array,0,$limit);//截取前$limit個(gè)  
  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. ?> 

上面都是紙上談兵了,下面來真實(shí)的了,要求如下:

有25幅作品拿去投票,一次投票需要選16幅,單個(gè)作品一次投票只能選擇一次,前面有個(gè)程序員捅了漏子,忘了把投票入庫,有200個(gè)用戶產(chǎn)生的投票序列為空,那么你會(huì)如何填補(bǔ)這個(gè)漏子?

當(dāng)然向上級反映情況,但是我們這里討論的是技術(shù),就是需要生成1-25之間的16個(gè)不重復(fù)的隨機(jī)數(shù),去填補(bǔ),具體怎么設(shè)計(jì)函數(shù)呢?將隨機(jī)數(shù)存入數(shù)組,再在數(shù)組中去除重復(fù)的值,即可生成一定數(shù)量的不重復(fù)隨機(jī)數(shù),代碼如下:

  1. <?php 
  2. /* 
  3. * array unique_rand( int $min, int $max, int $num ) 
  4. * 生成一定數(shù)量的不重復(fù)隨機(jī)數(shù) 
  5. * $min 和 $max: 指定隨機(jī)數(shù)的范圍 
  6. * $num: 指定生成數(shù)量 
  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. ?> 

程序運(yùn)行如下:1 2,3,4,6,7,8,9,10,11,12,13,16,20,21,22,24

補(bǔ)充幾點(diǎn)說明:

•生成隨機(jī)數(shù)時(shí)用了 mt_rand() 函數(shù)。這個(gè)函數(shù)生成隨機(jī)數(shù)的平均速度要比 rand() 快四倍。

•去除數(shù)組中的重復(fù)值時(shí)用了“翻翻法”,就是用 array_flip() 把數(shù)組的 key 和 value 交換兩次。這種做法比用 array_unique() 快得多。

•返回?cái)?shù)組前,先使用 shuffle() 為數(shù)組賦予新的鍵名,保證鍵名是 0-n 連續(xù)的數(shù)字。如果不進(jìn)行此步驟,可能在刪除重復(fù)值時(shí)造成鍵名不連續(xù),給遍歷帶來麻煩。

再看一個(gè)實(shí)例:生成0-z這36個(gè)字符中的一個(gè)。每次調(diào)用 getOptions() 方法生成一個(gè)字符,它們的存儲(chǔ)如下: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之間隨機(jī)生成一個(gè)數(shù)作為索引,其實(shí)就是在上面數(shù)組中隨機(jī)取出一個(gè)數(shù),作為變量 $result 中的第一個(gè)字符,這個(gè)隨機(jī)索引隨后會(huì)被賦值成數(shù)組最后一個(gè),它將不會(huì)參與下一輪的隨機(jī)選取,代碼如下:

  1. <?php 
  2. // 生成0123456789abcdefghijklmnopqrstuvwxyz中的一個(gè)字符 
  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. // 隨機(jī)生成數(shù)組索引,從而實(shí)現(xiàn)隨機(jī)數(shù) 
  26. for($j=0; $j<100; $j++) 
  27.   $result = ""
  28.   $options = getOptions(); 
  29.   $lastIndex = 35; 
  30.   while (strlen($result)<$len
  31.   { 
  32.     // 從0到35中隨機(jī)取一個(gè)作為索引 
  33.   $index = rand(0,$lastIndex); 
  34.   // 將隨機(jī)數(shù)賦給變量 $chr 
  35.     $chr = $options[$index]; 
  36.   // 隨機(jī)數(shù)作為 $result 的一部分 
  37.     $result .= $chr
  38.     $lastIndex = $lastIndex-1; 
  39.   // 最后一個(gè)索引將不會(huì)參與下一次隨機(jī)抽獎(jiǎng) 
  40.     $options[$index] = $options[$lastIndex]; 
  41.   } 
  42.   echo $result."n"
  43. ?>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黎城县| 普兰店市| 长兴县| 宁乡县| 德钦县| 南平市| 西畴县| 巫山县| 怀安县| 浦东新区| 巴马| 襄樊市| 丰原市| 晋州市| 嵊泗县| 蓝山县| 当雄县| 牙克石市| 十堰市| 太仆寺旗| 云霄县| 清流县| 阿拉善右旗| 平顶山市| 宝兴县| 长宁县| 竹山县| 太保市| 平邑县| 和林格尔县| 中西区| 六盘水市| 商丘市| 东平县| 佛学| 武义县| 阜平县| 无极县| 安新县| 富平县| 拉孜县|