C++演算法(1)
第一篇
1.從n個數中等概率的輸出m個數
//從0,1,2....,n-1中隨機等概率的輸出m個不重複的數,每個數被輸出的概率都為m/n
void knuth(int n, int m)
{
srand((unsigned int)time(0));
for (int i = 0; i < n; i++) {
if (rand()%(n-i)<m) {
cout << i << endl;
m--;
}
}
}
由這個for迴圈迴圈n次,且在滿足條件時才輸出i,可知,輸出m個不同值的要求已滿足,因為每次輸出的都是i值,而i值每次都是不一樣的。
在i=0時,rand()%(n-i)的取值範圍為0到n-1,共n個數,此時要輸出0只需要rand()%(n-i)小於m,故i=0被輸出的概率為m/n;
在i=1時,rand()%(n-i)的取值範圍為0到n-2,共n-1個數,若i=0沒有被輸出,則m–未被執行,此時i=1被輸出的概率為m/(n-1),若i=0已經被輸出了,則m變為m-1,此時i=1被輸出的概率為(m-1)/(n-1);由概率論的知識,可知此時i=1被輸出的概率為P=(1-m/n)(m/(n-1))+m/n
輸入:
knuth(800, 20);
輸出
2.迭代進行質因數分解
void prim(int m, int n)
{
if (m >= n)
{
while (m%n) n++;
m/=n;
prim(m, n); //no.1
cout << n << endl; //no.2
}
}
遞迴分解質因數,而且是從大到小輸出,改變no.1和no.2的順序,就可以從小到大輸出,這裡的固定為2
輸入:
prim(430, 2);
輸出