多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > php生成多個不重復的隨機數(shù)實例程序

php生成多個不重復的隨機數(shù)實例程序

來源:程序員人生   發(fā)布時間:2014-05-16 08:01:08 閱讀次數(shù):3441次

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

  1. <?php  
  2. //range 是將1到100 列成一個數(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 列成一個數(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); 

實例代碼二如下:

  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間隨機產(chǎn)生5個不重復的值,代碼如下:

  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ù)組隨機排列函數(shù)  
  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個用戶產(chǎn)生的投票序列為空,那么你會如何填補這個漏子?

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

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

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

補充幾點說明:

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

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

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

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

  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. // 隨機生成數(shù)組索引,從而實現(xiàn)隨機數(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中隨機取一個作為索引 
  33.   $index = rand(0,$lastIndex); 
  34.   // 將隨機數(shù)賦給變量 $chr 
  35.     $chr = $options[$index]; 
  36.   // 隨機數(shù)作為 $result 的一部分 
  37.     $result .= $chr
  38.     $lastIndex = $lastIndex-1; 
  39.   // 最后一個索引將不會參與下一次隨機抽獎 
  40.     $options[$index] = $options[$lastIndex]; 
  41.   } 
  42.   echo $result."n"
  43. ?>
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: www.自拍| 国产成人乱码一区二区三区 | 国产精品国产亚洲精品不卡 | 交性大片欧美网 | 日本欧美久久久久免费播放网 | 欧美 日韩 中字 国产 | 五月天久久综合 | 国产精品国产三级国产无毒 | 最新中文字幕在线视频 | 久久久久久久久国产 | 欧美猛交xxxx乱大交 | 国产福利不卡视频在免费 | 可以免费观看的黄色网址 | 国产精品免费久久久久影院 | 欧美一级大黄特黄毛片视频 | 天天性综合 | 2022在线精品视频网站 | 亚洲一本视频 | 国产免费人人看大香伊 | 国产精品久久久久久久久 | 伊人网在线免费观看 | 最近中文字幕mv在线高清 | 影音先锋色天使 | 免费一级毛片正在播放 | 日本青草视频 | 黄页网址免费观看18网站 | 日本欧美不卡一区二区三区在线 | 欧美精品 在线观看 | 午夜成人免费视频 | 五月婷婷欧美 | 亚洲精品小说 | 337p日本欧洲亚洲大胆色噜噜 | 亚州五月天| 久久精品视频一区 | 国内精品久久久久久久999下 | 日本不卡免费在线 | 国产欧美日韩精品第一区 | 拍拍拍无挡视频免费全程1000 | 成人精品网 | 亚洲动漫在线观看 | 2022国内精品免费福利视频 |