成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

比較洗牌算法的兩種實(shí)現(xiàn)方法

開發(fā) 后端 算法
我們首先會(huì)介紹隨機(jī)生成法,該方法要點(diǎn)就是從頭開始逐個(gè)隨機(jī)生成規(guī)定區(qū)域的數(shù)字,如果新生成隨機(jī)數(shù)之前已經(jīng)生成過(guò)就不保存該數(shù);如果新生成的隨機(jī)數(shù)之前沒(méi)有生成過(guò)就保存該數(shù);直到生成的數(shù)字的數(shù)量達(dá)到所需的數(shù)量。接下來(lái)我們還會(huì)介紹交換位置法。

方法一:隨機(jī)生成法

首先,我介紹一種很常見的方法:隨機(jī)生成法(我自己命名的),這方法我在掃雷游戲中隨機(jī)分布雷的位置時(shí)用過(guò)(思想是一樣的),該方法要點(diǎn)就是從頭開始逐個(gè)隨機(jī)生成規(guī)定區(qū)域的數(shù)字,如果新生成隨機(jī)數(shù)之前已經(jīng)生成過(guò)就不保存該數(shù);如果新生成的隨機(jī)數(shù)之前沒(méi)有生成過(guò)就保存該數(shù);直到生成的數(shù)字的數(shù)量達(dá)到所需的數(shù)量。

實(shí)現(xiàn)代碼如下:

  1. size_t shuffle(char s[], int n) 
  2.     size_t t=0;//計(jì)算循環(huán)次數(shù) 
  3.     int c=0; 
  4.     while(c<n) 
  5.     { 
  6.         t++; 
  7.         int num = rand()%n; 
  8.         if (memchr(s,num,c) == NULL) 
  9.         { 
  10.             s[c++] = static_cast<char>(num); 
  11.         } 
  12.     } 
  13.     return t; 
  14.  
  15.  
  16. void printCards(char s[], int n) 
  17.     for (int i=0; i<n; i++) 
  18.     { 
  19.         cout << static_cast<int>(s[i]) << " "
  20.     } 
  21.     cout << endl; 

代碼中使用了memchr函數(shù)(時(shí)間復(fù)雜度可能是O(n),沒(méi)找到依據(jù)),即使是O(1),它的循環(huán)生成隨機(jī)數(shù)的次數(shù)是不固定的(大于等于需要生成的個(gè)數(shù))。

方法二:交換位置法

這種方法是我昨天在參加騰訊筆試考試時(shí)候想到的,今天回到學(xué)校后在寢室測(cè)試了一番,基本思路是:先初始化一串分布的數(shù)字,然后為每個(gè)位置依次生成一個(gè)與之交換的隨機(jī)位置,如果生成的隨機(jī)位置不是它本身就執(zhí)行交換操作。

實(shí)現(xiàn)代碼:

  1. void swap(int& a, int& b) 
  2.     a = a^b; 
  3.     b = a^b; 
  4.     a = a^b; 
  5.  
  6. size_t shuffle2(int s[], int n) 
  7.     size_t t=0;//計(jì)算循環(huán)次數(shù) 
  8.     for (int i=0; i<n; i++) 
  9.     { 
  10.         t++; 
  11.         s[i] = i; 
  12.     } 
  13.     for (int i=0; i<n; i++) 
  14.     { 
  15.         t++; 
  16.         int num = rand()%n; 
  17.         if (num != i) 
  18.         { 
  19.             swap(s[num],s[i]); 
  20.         } 
  21.     } 
  22.     return t; 
  23.  
  24. void printCards2(int s[], int n) 
  25.     for (int i=0; i<n; i++) 
  26.     { 
  27.         cout << s[i] << " "
  28.     } 
  29.     cout << endl; 

比較:在時(shí)間上方法二比方法一快好多,因?yàn)榻粨Q位置的次數(shù)的***值是限定了的(生成隨機(jī)數(shù)的次數(shù)是固定的),而且省去了查找新生成數(shù)是否在已生成數(shù)中的時(shí)間。方法一中,當(dāng)新生成的數(shù)在已生成的數(shù)中就需要從新生成一個(gè)隨機(jī)數(shù),從而隨機(jī)生成數(shù)的次數(shù)是不固定的(有最小值)。

測(cè)試代碼:

 

結(jié)果:

image

我還是不能確定第二種方法是不是更好的,因?yàn)槭亲约合氲降模业尿?yàn)證也不是很完善,也許有什么其他的缺點(diǎn)(比如說(shuō)隨機(jī)性太弱),也沒(méi)在其他書上看到過(guò),如果網(wǎng)友們?cè)谀目吹竭^(guò)就告訴下我吧,方法一是在《c和c++代碼精粹》中文版P97中找到的。

后續(xù)補(bǔ)充:

謝謝chncwang的回復(fù),方法二不是完全隨機(jī)的,完全隨機(jī)的修改如下:

  1. size_t shuffle22(int s[], int n) 
  2.     size_t t=0;//計(jì)算循環(huán)次數(shù) 
  3.     for (int i=0; i<n; i++) 
  4.     { 
  5.         t++; 
  6.         s[i] = i; 
  7.     } 
  8.     for (int i=n-1; i>0; --i) 
  9.     { 
  10.         t++; 
  11.         int num = rand()%(i+1); 
  12.         if (num != i) 
  13.         { 
  14.             swap(s[num],s[i]); 
  15.         } 
  16.     } 
  17.     return t; 
因?yàn)?quot;第1次移動(dòng)后,第1個(gè)數(shù)還在第1個(gè)位置的概率是1/n,后續(xù)移動(dòng)只會(huì)減少這個(gè)概率。所以這個(gè)算法不是完全隨機(jī)的"。修改后的算法其實(shí)就是使用C++的STL<algorithm>庫(kù)中的random_shuffle()函數(shù)的實(shí)現(xiàn)方法。取隨機(jī)數(shù)的時(shí)候的范圍每次都隨著i的改變而變動(dòng),這樣就不會(huì)減少之前的位置的數(shù)還是原來(lái)的數(shù)的概率了(即后續(xù)交換操作不會(huì)影響到已經(jīng)交換過(guò)的位置)。

使用標(biāo)準(zhǔn)庫(kù)<algorithm>中的random_shuffle()函數(shù)實(shí)現(xiàn)很簡(jiǎn)單,代碼如下:

  1. int main() 
  2.     vector<int> s_stl; 
  3.     for (int i=0; i<CARDS_COUNT; ++i) s_stl.push_back(i); 
  4.     random_shuffle(s_stl.begin(),s_stl.end()); 
  5.     cout << "使用C++算法庫(kù):"
  6.     for (vector<int>::iterator it=s_stl.begin(); it!=s_stl.end(); ++it) 
  7.         cout << " " << *it; 
  8.     return 0; 

 

原文鏈接:http://www.cnblogs.com/hanxi/archive/2012/10/15/2725047.html

【編輯推薦】

 

 

 

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2010-10-14 14:33:15

MySQL多表聯(lián)查

2011-08-09 13:50:01

iPhone動(dòng)畫UIView

2010-07-13 10:47:18

Perl面向?qū)ο?/a>

2010-07-14 16:28:58

配線架

2009-07-31 14:04:11

C#時(shí)間比較大小

2009-04-21 11:23:56

Oraclespool比較

2013-06-27 09:26:50

Android界面刷新

2022-02-09 07:03:01

SpringNacos服務(wù)注冊(cè)

2010-04-25 17:34:30

負(fù)載均衡實(shí)現(xiàn)

2010-09-13 13:05:03

sql server分

2020-09-23 09:24:01

堆棧開發(fā)實(shí)現(xiàn)

2010-09-06 17:26:54

SQL函數(shù)

2011-06-23 09:07:16

2009-06-19 17:05:08

MVC框架Struts和Spri

2009-10-20 13:59:59

網(wǎng)絡(luò)綜合布線系統(tǒng)

2022-02-21 08:18:38

option編程模式

2010-07-14 10:30:26

Perl多線程

2017-11-16 09:20:20

內(nèi)存虛擬化技術(shù)

2010-09-17 09:37:27

Java安裝方法

2021-12-08 10:47:35

RabbitMQ 實(shí)現(xiàn)延遲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 综合久| 天堂成人国产精品一区 | av色站 | 成人网在线观看 | 在线播放国产一区二区三区 | 日韩精品一区二区三区中文字幕 | 美女在线视频一区二区三区 | 国产精品 欧美精品 | www.4567| 午夜寂寞影院列表 | 在线观看免费av网站 | 国产精品91久久久久久 | 狠狠久| 国产91网站在线观看 | 国产色网站 | 一区二区三区四区电影视频在线观看 | 中日av| 欧美日韩电影一区 | 亚洲综合在线视频 | 91 中文字幕 | 欧美电影免费观看高清 | 日韩久久久久久 | 欧美中文字幕一区二区三区亚洲 | www.精品国产| 黄色播放 | 欧美一级www片免费观看 | 欧美激情综合 | 欧美13videosex性极品 | 免费视频久久 | 四虎在线观看 | 欧美福利| 久久精品国产亚洲一区二区三区 | 精品国产91亚洲一区二区三区www | 国产日韩欧美一区 | 亚洲欧美成人影院 | 欧美精品乱码久久久久久按摩 | 国产成人免费视频网站高清观看视频 | 请别相信他免费喜剧电影在线观看 | 91av在线影院 | 青青草综合 | 日日操操 |