高效產生m個n範圍內的不重複隨機數(m n

2022-03-05 10:42:57 字數 638 閱讀 2304

如何產生不重複的隨機數?最容易想到的方法,是逐個產生這些隨機數,每產生乙個,都跟前面的隨機

數比較,如果重複,就重新產生。這是個很笨的方法,且比較次數呈線性增長,越往後次數越多。其實這些

比較是多餘的,完全可以不進行比較,只要反過來,按順序產生這些數,但隨機產生它們的位置。例如下

面產生100個100以內不重複隨機數的**:  

c**: 

int a[100];

for(i=0; i<=99; ++i) a[i]=i;

for(i=99; i>=1; --i) swap(a[i], a[rand()%i]);

上面這段**只需要遍歷一次就可以產生這100個不重複的隨機數,它是如何做到的呢?首先第二行按順

序用0到99填滿整個陣列;第三行,是隨機產生從0到m-2個陣列下標,把這個下標的元素值跟m-1下標的元

素值交換,一直進行到下標為1的元素。因此它只需要遍歷一次就能產生全部的隨機數。

原文:該版本應該是通用型的吧,下面來個php版本的,利用array_rand函式

php**:

1$arr = array();

2for($i=0; $i

<=99; $i++) 

5$arr = array_rand($arr,20);

產生 0 n 1 範圍內的 m 個隨機整數

產生 0 n 1 範圍內的 m 個隨機整數的有序列表,且不允許重複,m n 注 參考 一書 include include include include using namespace std 產生較大的隨機數 int bigrand 隨機返回m,n之間的整數。int randint int m,...

php獲取一定範圍內取N個不重複的隨機數

jqhem range 是將1000到9999 列成乙個陣列 numbers range 1000,9999 shuffle 將陣列順序隨即打亂 shuffle numbers array slice 取該陣列中的某一段 r程式設計客棧esult array slice numbers,0,3 pr...

如何產生1 100 之間的100個不重複的隨機數

1 首先從原始陣列中隨機選擇乙個數字,然後將該數字從陣列中剔除,再隨記選,再剔除,重複99次,就解決了。我們知道從陣列中剔除乙個元素的複雜度為o n 那麼隨機選取n個數字,它的複雜度就是o n2 了。2 用hash作為中間過濾層,因為在陣列中,我們採用隨機數的話,也許隨機數在多次隨機中可能會有重複,...