隨機數組重排

2021-06-16 12:38:00 字數 932 閱讀 4035

沒事看到的,**csdn

假使你需要把乙個陣列隨機打亂順序進行重排。你需要保證重排後的結果是概率均等、完全隨機的。下面兩種演算法哪一種是正確的?其中,random(a,b)函式用於返回乙個從a到b(包括a和b)的隨機整數。

1. for i:=1 to n do swap(a[i], a[random(1,n)]);

2. for i:=1 to n do swap(a[i], a[random(i,n)]);

如果不仔細思考的話,絕大多數人會認為第乙個演算法才是真正隨機的,因為它的操作「更對稱」,保證了概率均等。但靜下心來仔細思考,你會發現第二種演算法才是真正滿足隨機性的。為了證明這一點,只需要注意到演算法的本質是「隨機確定a[1]的值,然後遞迴地對後n-1位進行操作」,用數學歸納法即可輕易說明演算法的正確性。而事實上,這段程式一共將會產生n*(n-1)*(n-2)*...*1種等可能的情況,它們正好與1至n的n!種排列一一對應。

有人會問,那第一種演算法為什麼就錯了呢?看它的樣子多麼對稱美觀啊……且慢,我還沒說第一種演算法是錯的哦!雖然第一種演算法將產生比第二種演算法更多的可能性,會導致一些重複的數列,但完全有可能每種數列重複了相同的次數,概率仍然是均等的。事實上,更有可能發生的是,這兩種演算法都是正確的,不過相比之下呢第一種演算法顯得更加對稱美觀一些。為此,我們需要說明,第一種演算法產生的所有情況均等地分成了n!個等價的結果。顯然,這個演算法將會產生n^n種情況,而我們的排列一共有n!個,因此n^n必須能夠被n!整除才行(否則就不能均等地分布了)。但是,n!裡含有所有不超過n的質數,而n^n裡卻只有n的那幾個質因子。這表明要想n^n能被n!整除,n的質因子中必須含有所有不超過n的質數。這個結論看上去相當荒唐,反例遍地都是,並且直覺上告訴我們對於所有大於2的n這都是不成立的。為了證明這一點,只需要注意到2是質數,並且根據bertrand-chebyshev定理,在n/2和n之間一定還有乙個質數。這兩個質數的乘積已經大於n了。搞了半天,第一種看似對稱而美觀的演算法居然是錯的!

js 隨機數組

生成指定num start 個陣列長度,值為start num 的隨機數組,不包括num這個值 function rand arr num,start if arguments 1 else 轉型 num typeof num number num parseint num 判斷值 if start...

numpy生成隨機數組

python想要生成隨機數的話用使用random庫很方便,不過如果想生成隨機數組的話,還是用numpy更好更強大一點。rarray numpy.random.random size 10 或者rarray numpy.random.random 10,或者rarray numpy.random.un...

numpy的隨機數組

建立指定大小的隨機數組,取值範圍 0,1 import numpy as np 建立2行2列取值範圍為 0,1 的陣列 arr np.random.rand 2,2 或import numpy as np 建立一維陣列,元素個數為10,取值範圍為 0,1 arr1 np.random.rand 10...