斗牛扑克控制发牌大小(即好牌或者坏牌)随机发牌,如何避免2次随机结果中出现相同的牌

guicaisa 2018-03-01 02:31:36
斗牛扑克玩法,一共52张牌(无大小王),每个人5张牌比大小,考虑所有的牌型排列组合一共有c(52, 5)即2598960种组合方式,将所有组合根据斗牛比大小的规则进行排列。如下一部分截图


发牌的时候,使用随机值rand(1, 2598960)的结果再辅以一些算法和参数控制随机值结果在(1, 2598960)这个区域中偏向更大或更小(即控制发更好的牌或更差的牌)。

但是这种随机发牌有个问题,比如我第一次随机一个组合 {方块A,红桃2, 红桃3, 红桃4,红桃5}。将这5张牌发给玩家1,之后需要给玩家二发牌,又进行一次随机,结果是{方块A,黑桃2,黑桃3,黑桃4,黑桃5},问题就来了,此时的方块A已经发送给玩家1,斗牛只用一副牌,所以此时根本无法发出这种组合的牌,这样随机的结果必定是错误的,并且随机碰撞率非常的高。此时的所有牌型组合应该有i所改变,为c(47, 5)个,但是如果需要重新生成可用牌型库,效率是非常低下,肯定行不通,我也考虑过剔除与第一次随机组合的5张牌中相关联的组合的索引,发现数量级也是非常大,效率十分低。

想请问下各位老哥,关于这种类型的问题有什么好的建议或者有什么其他的算法可以参考一下。或者是否可以缩减牌型组合的数量。十分感谢!
...全文
1441 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-02
  • 打赏
  • 举报
回复
生成Release版的64bit程序再试试。
donjin9 2018-03-01
  • 打赏
  • 举报
回复
牌多的时候按顺序查找,牌少的时候再重新组合。。。。
guicaisa 2018-03-01
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
int cards[52];假设每个元素0表示已发出,1~13表示红桃点数,101~113表示黑桃点数... 先按顺序初始化,然后随机洗牌(随机交换元素),之后按顺序发牌即可。
。。。。。。不是这种,我是要控制发牌的大小,如果只是随机发牌,根本无法有效控制你发牌的大小。我的这个问题是根据斗牛规则生成所有可能的发出的牌的组合,按照大小排列的,根据随机值以及部分参数调节控制随机值的大小以达到发好牌或者发坏牌的目的,现在的问题是第一次随机之后,52张牌中的5张牌被发出去了,导致第二次随机的时候得到的组合结果中包含已经发出去的牌(不是以52张牌为随机,而是以所有可能出现的牌型组合而随机,260W左右),考虑过滤掉相关的牌型组合或者重新生成剩余47张牌可能构成的所有组合效率太低。是这么一个问题。
  • 打赏
  • 举报
回复
int cards[52];假设每个元素0表示已发出,1~13表示红桃点数,101~113表示黑桃点数... 先按顺序初始化,然后随机洗牌(随机交换元素),之后按顺序发牌即可。
guicaisa 2018-03-01
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
STL set+map?
试过了,用 map<uint32_t, set<uint32_t>>的形式保存每张牌存在的组合编号,每张牌的对应的set的大小大概20W以上,随机第一次取出5张牌之后,从这个map中根据牌的id获得5个set之后,考虑上重复的组合的标号,大概也有80W-100W的大小(5个set取并集)。我试过将所有与第一次随机的5张牌相关的组合编号全部替换到(1,2598960)这个区间的末尾,然后第二次随机从(1, 2598960 - 第一次随机的5张牌相关联的所有组合个数)中重新随机,避免随机到一个与第一次的5张牌中有任何关系的组合的编号,但是仍然很耗时,样本容量太大了,
guicaisa 2018-03-01
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
参考相关开源项目的源代码?
暂时没找到类似的问题。。。所以问问来着
赵4老师 2018-03-01
  • 打赏
  • 举报
回复
参考相关开源项目的源代码?
赵4老师 2018-03-01
  • 打赏
  • 举报
回复
STL set+map?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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