随笔- 509  文章- 0  评论- 151  阅读- 22万 

2014-04-29 00:59

题目:设计一个洗牌算法,效率尽量快点,必须等概率。

解法:每次随机抽一张牌出来,最后都抽完了,也就洗好了。时间复杂度O(n^2),请看代码。

代码:

复制代码
 1 // 18.2 shuffle a deck of 52 cards, it must be perfect random.
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <ctime>
 5 #include <vector>
 6 using namespace std;
 7 
 8 void printCards(const vector<int> &cards)
 9 {
10     int i;
11     int n = (int)cards.size();
12     const int col = 8;
13     
14     for (i = 0; i < n; ++i) {
15         printf((i % col == col - 1 ? "%4d\n" : "%4d "), cards[i]);
16     }
17     printf("\n");
18 }
19 
20 void shuffleCards(vector<int> &cards)
21 {
22     vector<int> v;
23     
24     v = cards;
25     int i, j;
26     int n, n0;
27     int idx;
28     
29     n0 = n = (int)cards.size();
30     for (i = 0; i < n0; ++i) {
31         idx = rand() % n;
32         cards[i] = v[idx];
33         --n;
34         for (j = idx; j < n; ++j) {
35             v[j] = v[j + 1];
36         }
37     }
38     
39     v.clear();
40 }
41 
42 int main()
43 {
44     srand((unsigned)time(NULL));
45     vector<int> cards;
46     int i;
47     const int n = 52;
48     
49     cards.resize(n);
50     for (i = 0; i < n; ++i) {
51         cards[i] = i;
52     }
53     
54     shuffleCards(cards);
55     printCards(cards);
56     
57     return 0;
58 }
复制代码

 

 posted on   zhuli19901106  阅读(255)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示