背景:
有個存有1000個問題的題庫,用陣列numhastack存,現要從中隨機生成5道題。如果直接用隨機數生成函式rand(),然後把生成的題號存到陣列numgenerate中,會產生重複出現的問題。
參考我原來的博文:
1.最直接的解決辦法:
每隨機生成乙個數,就拿到陣列numgenerate中比較,如果存在,就重新rand,否則push到陣列中,知道陣列長度達到5.
這裡關鍵就是借助in_array()函式判斷num是否在array中。
<?php
$numgenerate = array();
$max = 1000;
for($i = 0;$i < 5;$i++)
$numgenerate[$i] = $num;
}var_dump($numgenerate);
?>
2 用shuffle函式,把固定的陣列打亂,然後,選擇前5個即可
shuffle函式原理:
我寫的shuffle函式
<?php
$times = 100;
function my_shuffle()
return $arr;
}var_dump(my_shuffle());
shuffle實現最終版:
<?php
$numhastack = array();
$numgenerate = array();
$max = 1000;
//better method: range(0,1000)
for($i = 0;$i <$max;$i++)
shuffle($numhastack);
for($i =0;$i < 5;$i++)
var_dump($numgenerate);
?>
3.借助於hashtable(相當於每個數都對應乙個flag)
,不到陣列numgenerate中比較,而是用while迴圈檢查hashtable[num] 的值是否為0(,沒去過是預設為0,取過則設為1),如果不為0,則重新生成num,知道hashtable[num] == 0;
<?php
$hashtable = array();
$numgenerate = array();
$max = 1000;
for($i = 0;$i < 5;$i++)
$numgenerate[$i] = $num;
$hashtable[$num] = 1;
}var_dump($numgenerate);
?>
4.速度最快的演算法(不做比較,只做交換)
<?php
/***generate 5 random numbers from total 1000 without duplicate **
*/$min = 0;
$max = 1000;
$numhastack = array();
$numgenerate = array();
for($i= 0;$i <= $max;$i++)
var_dump($numhastack);
for($i = 0;$i < 5;$i++)
var_dump($numgenerate);
參考文獻:
特別鳴謝:張亞傑同學
生成不重複的隨機數
思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把這個位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機 數的上限減一,具體如 先把這100個數放在乙個陣列內,每次隨機取乙個位置 第一次是1 100,第二次是1 99,將該位置的數用最後的數 代替。int index n...
不重複隨機數生成
直接上 生成 0,total 的隨機數 最大隨機數 ilist private static ilistgetrandomsequence int total random random new random for var i listbase.count 1 i 0 i return listo...
高效產生不重複的隨機數
purpose 生成隨機的不重複的測試資料 1000w資料量,要保證生成不重複的資料量,一般的程式沒有做到。但,本程式做到了。include include include include include include define size 10000000 int num size void ...