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

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

有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本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

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

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

《重來:更為簡單有效的商業思維》 賈森?弗里德(Jason Fried) (作者), 大衛?漢森(David Heinemeier Hansson) (作者), Mike Rohde (插圖作者), 李瑜偲 (譯者)

這本書呈現的是一種更好、更簡單的經商成功之道。讀完這本書,你就會明白為什么計劃實際上百害而無一益,為什么你不需要外界投資人,為什么將競爭視而不見反倒會發展得更好。事實是你所需要的比你想象的少得多。你不必成為工作狂,你不必大量招兵買馬,你不必把時間浪費在案頭工作和會議上,你甚至不必擁有一間辦公室。所有這些都僅僅是借口!

更多計算機寶庫...

燃烧吧足球登陆 网上打麻将赚钱的平台 同花顺手机炒股软件 网赚论坛怎么赚钱 一起温州麻将台炮灵溪 兴动哈尔滨麻将最新版本 山西十一选五走势图一定 秒速赛车预测软件 河南福彩22选5开奖结果走势图 广东快乐十分 小电影在线观看 黄 体彩浙江20选五杀号360 证券投资基金资产由谁保管 四肖期期 准 免费 金爵国际棋牌下载 天津快乐10分现场直播 陕西11选5app下载