下面寫(xiě)幾種生成不重復(fù)隨機(jī)數(shù)的方法,直接上代碼吧
創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、海豐網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、商城開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為海豐等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
復(fù)制代碼
代碼如下:
?php
define('RANDOM_MAX',
100);
define('COUNT',
10);
echo
'max
random
num:
'.RANDOM_MAX,
'
;result
count:'.COUNT,
'br/';
invoke_entry('rand1');
invoke_entry('rand2');
invoke_entry('rand3');
invoke_entry('rand4');
function
invoke_entry($func_name)
{
$time
=
new
time();
$time-time_start();
call_user_func($func_name);
echo
$func_name.'
time
spend:
',
$time-time_spend();
echo
'br/';
}
function
rand1()
{
$numbers
=
range
(1,
RANDOM_MAX);
shuffle($numbers); //隨機(jī)打亂數(shù)組
$result
=
array_slice($numbers,
1,
COUNT);
return
$result;
}
function
rand2()
{
$result
=
array();
while(count($result)
COUNT)
{
$result[]
=
mt_rand(1,
RANDOM_MAX); //mt_rand()是比rand()更好更快的隨機(jī)函數(shù)
$result
=
array_unique($result);
//刪除數(shù)組中重復(fù)的元素
}
return
$result;
}
function
rand3()
{
$result
=
array();
while(count($result)
COUNT)
{
$_tmp
=
mt_rand(1,
RANDOM_MAX);
if(!in_array($_tmp,
$result))
{ //當(dāng)數(shù)組中不存在相同的元素時(shí),才允許插入
$result[]
=
$_tmp;
}
}
return
$result;
}
function
rand4()
{
$result
=
array();
while
(count($result)
COUNT)
{
$result[]
=
mt_rand(1,
RANDOM_MAX);
$result
=
array_flip(array_flip($result)); //array_flip將數(shù)組的key和value交換
}
return
$result;
}
class
time
{
private
$_start;
public
function
time_start()
{
$this-_start
=
$this-microtime_float();
}
public
function
time_spend()
{
return
$this-microtime_float()
-
$this-_start;
}
private
function
microtime_float()
{
list($usec,
$sec)
=
explode("
",
microtime());
return
((float)$usec
+
(float)$sec);
}
}
?
無(wú)論是Web應(yīng)用,還是WAP或者移動(dòng)應(yīng)用,隨機(jī)數(shù)都有其用武之地。在最近接觸的幾個(gè)小項(xiàng)目中,我也經(jīng)常需要和隨機(jī)數(shù)或者隨機(jī)數(shù)組打交道,所以,對(duì)于PHP如何產(chǎn)生不重復(fù)隨機(jī)數(shù)常用的幾種方法小結(jié)一下(ps:方法1、4、5是我常用的,其余來(lái)自網(wǎng)絡(luò)整理)
方法一:
復(fù)制代碼
代碼如下:
?php
$numbers
=
range
(1,50);
//shuffle
將數(shù)組順序隨即打亂
shuffle
($numbers);
//array_slice
取該數(shù)組中的某一段
$num=6;
$result
=
array_slice($numbers,0,$num);
print_r($result);
?
方法二:
復(fù)制代碼
代碼如下:
?php
$numbers
=
range
(1,20);
//播下隨機(jī)數(shù)發(fā)生器種子,可有可無(wú),測(cè)試后對(duì)結(jié)果沒(méi)有影響
srand
((float)microtime()*1000000);
shuffle
($numbers);
//跳過(guò)list第一個(gè)值(保存的是索引)
while
(list(,
$number)
=
each
($numbers))
{
echo
"$number
";
}
?
方法三:
復(fù)制代碼
代碼如下:
?php
function
NoRand($begin=0,$end=20,$limit=5){
$rand_array=range($begin,$end);
shuffle($rand_array);//調(diào)用現(xiàn)成的數(shù)組隨機(jī)排列函數(shù)
return
array_slice($rand_array,0,$limit);//截取前$limit個(gè)
}
print_r(NoRand());
?
上述可以在1-20間隨機(jī)產(chǎn)生5個(gè)不重復(fù)的值
方法四:
復(fù)制代碼
代碼如下:
?php
$tmp=array();
while(count($tmp)5){
$tmp[]=mt_rand(1,20);
$tmp=array_unique($tmp);
}
print_r($tmp);
?
方法五:
復(fù)制代碼
代碼如下:
?php
$tmp
=
range(1,30);
print_r(array_rand($tmp,10));
?
這個(gè)可能是比叫簡(jiǎn)單的了(ps:如果在range中指定了步長(zhǎng),就必須注意array_rand的第二個(gè)參數(shù)是否超出$tmp的長(zhǎng)度)。
PHP提供非常豐富的數(shù)組函數(shù),產(chǎn)生隨機(jī)數(shù)大多可以從數(shù)組這個(gè)角度出發(fā),若你還有方法提供,歡迎給出,文章將持續(xù)更新。
說(shuō)下思路:
1. 將生成的數(shù)字保存到mysql數(shù)據(jù)庫(kù),然后每次生成的號(hào)碼不能與數(shù)據(jù)庫(kù)的數(shù)字重復(fù),請(qǐng)問(wèn)怎么弄?
先讀取數(shù)據(jù)庫(kù)已存在的數(shù)字,將結(jié)果以數(shù)組格式,與rand(1,1000)的數(shù)組相比較計(jì)算差集,去除這部分?jǐn)?shù)字(array_diff),再shuffle,得到新的隨機(jī)數(shù)。
我覺(jué)得,你完全可以建立一個(gè)序號(hào)表,比如,1-1000,每次用時(shí)先用隨機(jī)函數(shù)?。?-數(shù)據(jù)記錄數(shù))個(gè)數(shù)值,再用這個(gè)數(shù)值取得相應(yīng)的記錄,當(dāng)取出之后,刪除這個(gè)記錄,這樣保證記錄總數(shù)一直會(huì)減少且數(shù)字也不會(huì)重復(fù)。
2. 有沒(méi)有什么辦法生成的時(shí)候先生成一位數(shù)的,一位數(shù)生成滿了以后再生出兩位數(shù)的,兩位數(shù)滿了然后再三位數(shù)的,以此類推?
先獲取一位數(shù)的記錄,再?gòu)闹须S機(jī)抽取一個(gè),如果數(shù)據(jù)庫(kù)中沒(méi)有找到一位數(shù)的,就遞增一位數(shù),直到找到為止。
3. 代碼的執(zhí)行效率希望能越高越好!
如果想要代碼執(zhí)行效率,最好盡量減少與數(shù)據(jù)庫(kù)的交互。
有25幅作品拿去投票,一次投票需要選16幅,單個(gè)作品一次投票只能選擇一次。前面有個(gè)程序員捅了漏子,忘了把投票入庫(kù),有200個(gè)用戶產(chǎn)生的投票序列為空。那么你會(huì)如何填補(bǔ)這個(gè)漏子?
當(dāng)然向上級(jí)反映情況。但是我們這里討論的是技術(shù),就是需要生成1-25之間的16個(gè)不重復(fù)的隨機(jī)數(shù),去填補(bǔ)。具體怎么設(shè)計(jì)函數(shù)呢?將隨機(jī)數(shù)存入數(shù)組,再在數(shù)組中去除重復(fù)的值,即可生成一定數(shù)量的不重復(fù)隨機(jī)數(shù)。
程序如下:
復(fù)制代碼
代碼如下:
?php
/*
*
array
unique_rand(
int
$min,
int
$max,
int
$num
)
*
生成一定數(shù)量的不重復(fù)隨機(jī)數(shù)
*
$min
和
$max:
指定隨機(jī)數(shù)的范圍
*
$num:
指定生成數(shù)量
*/
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;
?
網(wǎng)頁(yè)題目:php列表隨機(jī)不重復(fù)數(shù)據(jù) mysql生成不重復(fù)的隨機(jī)數(shù)
瀏覽地址:http://jinyejixie.com/article30/docposo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷、自適應(yīng)網(wǎng)站、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)