斗地主之洗牌(shuffle)程序的测试程序
来源:互联网 发布:淘宝僵尸店宝贝上万个 编辑:程序博客网 时间:2024/05/01 04:00
在博文http://coolshell.cn/articles/8593.html中, 皓哥已经详细讨论了各种shuffle程序, 并给出了测试的结果, 但博文中没有提供测试代码。 其实, 测试代码也很简单, 在本文中, 我来写一下测试代码。
在之前的博文http://blog.csdn.net/stpeace/article/details/46583277中, 我已经给出了自己写的一个简单的shuffle程序, 现摘录如下:
#include <iostream>#include <ctime>#define N 10using namespace std;void initArr(int a[], int n){int i = 0;for(i = 0; i < n; i++){a[i] = i + 1;}}void shuffleArr(int a[], int n){int i = 0;int tmp = 0;for(i = 0; i < n; i++){int r1 = rand() % n;int r2 = rand() % n;tmp = a[r1];a[r1] = a[r2];a[r2] = tmp;}}void printArr(const int a[], int n){int i = 0;for(i = 0; i < n; i++){cout << a[i] << " ";}cout << endl;}int main(){srand(time(NULL));int i = 0;for(i = 0; i < 20; i++){int a[N] = {0};initArr(a, N);shuffleArr(a, N);printArr(a, N);}return 0;}这个shuffle程序的随机程度如何呢? 我来写个测试程序玩玩:
#include <iostream>#include <ctime>#define N 10 // 共有10张牌,标号为:1, 2, 3, 4, 5, 6, 7, 8, 9, 10using namespace std;// 记录最终测试结果, 其中shuffleTestArr[i][j]表示标号为i+1的牌出现在j+1位置的次数int shuffleTestArr[N][N] = {0};// poker初始化void initArr(int a[], int n){int i = 0;for(i = 0; i < n; i++){a[i] = i + 1;}}// 洗一洗poker, 洗刷刷洗刷刷void shuffleArr(int a[], int n){int i = 0;int tmp = 0;for(i = 0; i < n; i++){// 随机交换int r1 = rand() % n;int r2 = rand() % n;tmp = a[r1];a[r1] = a[r2];a[r2] = tmp;}}// 打印最终结果:void printTwoDimenArr(const int x[][N], int n){int i = 0;int j = 0;for(i = 0; i < n; i++){for(j = 0; j < N; j++){if(0 == j){printf("%2d|", i + 1);}printf("%8d", x[i][j]);}cout << endl;}cout << endl;}int main(){srand(time(NULL));int i = 0;int j = 0;int k = 0;for(i = 0; i < 1000000; i++) // 测试100万次{int a[N] = {0};initArr(a, N);shuffleArr(a, N); // 洗刷刷, 洗刷刷, 咚咚for(j = 0; j < N; j++) // 列, j+1表示位置{for(k = 0; k < N; k++) // k+1 = 1, 2, 3, 4, 5, 6, 7, 8, 9,10,表示牌的标号{if(k + 1 == a[j]){shuffleTestArr[k][j]++;}}}}cout << endl;for(i = 0; i < N; i++){if(0 == i){cout << " ";}printf("%8d", i + 1);}cout << endl;cout << " --------------------------------------""-----------------------------------------" << endl;printTwoDimenArr(shuffleTestArr, N);return 0;}结果为:
我们看看这是个什么意思(看第一列):
196905表示牌1出现在1的位置的次数
88891表示牌2出现在1的位置的次数
依次类推。
测试100万次, 按理说, 每个位置最后的统计数字应该接近:(10*1000000)/(10*10) = 100000, 看看上图, 大多数位置接近9万, 但是, 主对角线的值却很大, 都快20万了。 这说明什么呢? 说明很多情况下, 牌x放在x位置后, 不容易被置换走, 所以, 我之前写的洗牌算法并不太随机, 有待提高。 皓哥的博客给了很多shuffle程序, 大家可以参考:http://coolshell.cn/articles/8593.html
OK, 本文的主要目的是写一下shuffle程序的测试程序, 玩poker就到此为止吧。
0 0
- 斗地主之洗牌(shuffle)程序的测试程序
- 斗地主之洗牌(shuffle)程序(某公司招聘笔试、面试试题)
- 用java编写模拟斗地主洗牌发牌程序
- 一个模拟斗地主的小程序
- 斗地主算法之发牌,洗牌
- [cocos2dx]斗地主制作之洗牌算法
- 斗地主系列之洗牌和发牌
- 斗地主算法之发牌,洗牌
- 斗地主:洗牌发牌
- 斗地主发牌小程序
- QQ斗地主记牌器(流星程序集之二)
- 用java写的一个斗地主发牌小程序
- 大一用C#编写的斗地主程序
- java集合框架的练习之斗地主洗牌发牌的模拟(初级版)
- java集合框架的练习之斗地主洗牌发牌的模拟(升级版)
- 斗地主洗牌+发牌+排序
- Java-斗地主洗牌发牌
- 斗地主洗牌发牌案例
- scala必知必会之列表的map,flatMap,zip和reduce
- 30 分钟快快乐乐学 SQL Performance Tuning
- Spring3.0与Quartz的整合实现定时任务调度
- ios 类型编码表
- Java中ArrayList 的remove&removeall
- 斗地主之洗牌(shuffle)程序的测试程序
- 可变数组
- json语法
- 约瑟夫问题
- list之extend方法的一个错误使用案例分析
- 为什么要写博客?
- OJ第二批——Problem E:构造函数和析构函数
- 获取Android设备挂载的所有存储器
- iOS 上下有黑边