PHP CodeBase: 生成N個不重復的隨機數

隨機數的生成函數
服務器君一共花費了407.237 ms進行了5次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

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

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

程序如下:

<?php
/*
* array unique_rand( int $min, int $max, int $num )
* 生成一定數量的不重復隨機數
* $min 和 $max: 指定隨機數的范圍
* $num: 指定生成數量
*/
function unique_rand($min, $max, $num) {
    $count = 0;
    $return = array();
    while ($count < $num) {
        $return[] = mt_rand($min, $max);
        $return = array_flip(array_flip($return));
        $count = count($return);
    }
    shuffle($return);
    return $return;
}

$arr = unique_rand(1, 25, 16);
sort($arr);

$result = '';
for($i=0; $i < count($arr);$i++)
{
	$result .= $arr[$i].',';
}
$result = substr($result, 0, -1);
echo $result;
?>

程序運行如下:

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 連續的數字。如果不進行此步驟,可能在刪除重復值時造成鍵名不連續,給遍歷帶來麻煩。

延伸閱讀

此文章所在專題列表如下:

  1. PHP CodeBase: 通過新浪微博API獲取數據
  2. PHP CodeBase: 過濾XSS攻擊的PHP函數
  3. PHP CodeBase: 將時間顯示為“剛剛”“n分鐘/小時前”等
  4. PHP CodeBase: 求最近一個周一和上周一的日期
  5. PHP CodeBase: 獲取遠程圖片的體積大小
  6. PHP CodeBase: 生成N個不重復的隨機數
  7. PHP CodeBase: 判斷用戶是否手機訪問

本文地址:http://www.snpmgr.live/librarys/veda/detail/2508,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.snpmgr.live/librarys/veda/detail/2508

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏

大家都在看

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《C專家編程》 林登 (LinDen.P.V.D) (作者), 徐波 (譯者)

《C專家編程》展示了最優秀的C程序員所使用的編碼技巧,并專門開辟了一章對C++的基礎知識進行了介紹。書中C的歷史、語言特性、聲明、數組、指針、鏈接、運行時、內存以及如何進一步學習C++等問題進行了細致的講解和深入的分析。全書擷取幾十個實例進行講解,對C程序員具有非常高的實用價值。《C專家編程》可以幫助有一定經驗的C程序員成為C編程方面的專家,對于具備相當的C語言基礎的程序員,《C專家編程》可以幫助他們站在C的高度了解和學習C++。

更多計算機寶庫...

燃烧吧足球登陆