起因:
有25幅作品拿去投票,一次投票需要選16幅,單個作品一次投票只能選擇一次。前面有個程式設計師捅了漏子,忘了把投票入庫,有200個使用者產生的投票序列為空。那麼你會如何填補這個漏子?
當然向上級反映情況。但是我們這裡討論的是技術,就是需要生成1-25之間的16個不重複的隨機數,去填補。具體怎麼設計函式呢?將隨機數存入陣列,再在陣列中去除重複的值,即可生成一定數量的不重複隨機數。
程式如下:
複製** **如下:
php/*
* array unique_ran程式設計客棧d( int $min, int $max, int $num )
* 生成一定數量的不重複隨機數
* $min 和 $max: 指定隨機數的範圍
* $num: 指定生成數量
*/function unique_rand($min, $max, $num)
shuffle($return);
return $return;
}$arr = unique_rand(1, 25, 16);
sort($arr);
$result = '';
for($i=0; $i < count($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 連續的數字。如果不進行此步驟,可能在刪除重複值時造成鍵名不連續,給遍歷帶來麻煩。
本文標題: php 生成n個不重複的隨機數
本文位址:
PHP生成N個不重複的隨機數
原理就是將陣列順序隨即打亂 然取該陣列中的某一段 方法1 range 是將1到100 列成乙個陣列 numbers range 1,100 shuffle 將陣列順序隨即打亂 shuffle numbers array slice 取該陣列中的某一段 result array slice numbe...
不重複隨機數生成
直接上 生成 0,total 的隨機數 最大隨機數 ilist private static ilistgetrandomsequence int total random random new random for var i listbase.count 1 i 0 i return listo...
產生n個不重複的隨機數
這是最容易想到的方法,逐個產生這些隨機數,每產生乙個,都跟前面的隨機數比較,如果重複,就重新產生。可以使用hashtable或陣列標記,這種方法效率比較低,且比較次數呈線性增長,越往後次數越多。所謂 篩選法 就是根據要產生隨機數指定的範圍 起始數必須小於終止數 將這些數全部裝入乙個陣列,然後利用系統...