麻将发牌的算法

sgwezz 2007-07-20 10:56:37
谁能给个麻将发牌的算法,谢谢
...全文
1145 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-05-24
  • 打赏
  • 举报
回复
随机必然有重复。
所谓“不重复的随机”根本就不是什么随机;而是洗牌。
洗牌算法参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
srand(time(NULL));
printf("shuffle 0..n-1 demo\n");
for (n=1;n<=5;n++) {/* 测试1~5个元素 */
printf("_____n=%d_____\n",n);
j=1;
for (c=1;c<=n;c++) j=j*c;/* j为n! */
j*=n*2;
for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
for (i=n;i>0;i--) {/* 打乱0~n-1 */
a=i-1;b=rand()%i;
if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
}
printf("%04d:",c);
for (i=0;i<n;i++) printf("%d",d[i]);
printf("\n");
}
}
printf("shuffle 1..n demo\n");
for (n=1;n<=5;n++) {/* 测试1~5个元素 */
printf("_____n=%d_____\n",n);
j=1;
for (c=1;c<=n;c++) j=j*c;/* j为n! */
j*=n*2;
for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
for (i=n;i>1;i--) {/* 打乱1~n */
a=i;b=rand()%i+1;
if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
}
printf("%04d:",c);
for (i=1;i<=n;i++) printf("%d",d[i]);
printf("\n");
}
}
}

W170532934 2012-05-23
  • 打赏
  • 举报
回复
用个bitmap来标示是否已经发了,然后随机数发牌,如果已经发了二次随机。
开始丶征途 2012-05-23
  • 打赏
  • 举报
回复
用java 啊 集合 直接用方法洗牌, 把数放在里面洗牌方法后一张一张用就行了
  • 打赏
  • 举报
回复
呵呵!~好像之前就有人问过!~
kakabulusi 2008-07-25
  • 打赏
  • 举报
回复
假设当前有n张牌
你可以按顺序生成,排列到一个链表里,
生成随机数 i=rand()%n(如何取随机数算法可由设计者决定) 从链表当中将第i个结点的牌取出,删除该结点,n-1,
直接取牌就行了.而且不用进行牌面的合法性验证.
next163 2008-07-11
  • 打赏
  • 举报
回复
我做过一个发扑克的小程序,就是随机的无重复数算法.但有个小问题,我用了时间函数做随机种子,但每次发牌感觉是那么的相似.....
Y神圣 2008-07-11
  • 打赏
  • 举报
回复
一个数组记录所有的麻将牌,然后另外一个数组记录所有已发的牌,另外你可以做一个Temp数组,用来记录剩下的牌,然后在这个记录剩下牌的数组里面做随机算法,如果超出长度就取模。
唐巧 2007-07-21
  • 打赏
  • 举报
回复
用随机函数就可以了呀~
yujialin 2007-07-20
  • 打赏
  • 举报
回复
干什么要人家的啊,自己做一个不就行了啊!
gclu212 2007-07-20
  • 打赏
  • 举报
回复
无重复随即数生成
lockhall 2007-07-20
  • 打赏
  • 举报
回复
麻将不会玩

麻将136个牌?

:)
superarhow 2007-07-20
  • 打赏
  • 举报
回复
楼上的好,不过发给电脑的要特殊处理一下,建议随机产生1-3,随到1,先发清一色给电脑,随到2,七对子,随到3,四暗刻……… 表扔砖,HOHO~~~
hufeikong 2007-07-20
  • 打赏
  • 举报
回复
感觉你要的不应该是发牌算法,而是洗牌算法,牌就是存储在数组里,只要洗好牌,顺序发下去就好了啊!
我写的洗牌算法,希望可以帮到你

1,首先定义数组paiqiang[136](就是所有的牌)表示牌墙。
洗牌开始

2,设置随机种子

3,这样就把136张牌系乱了
for(i=0;i<135;i++)
{
r=rand()%(136-i);
t=paiqiang[136-i-1];
paiqiang[136-i-1]=paiqiang[r];
paiqiang[r]=t;
}

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧