找回密码
 加入
搜索
楼主: 9922250

[效率算法] 问题:假设有 6副 副克牌,(一副是52张),就是一共312张。求随机排序

 火.. [复制链接]
发表于 2014-10-26 10:24:31 | 显示全部楼层
不对,lz到底要排序还是要组合
发表于 2014-10-26 11:09:11 | 显示全部楼层
还是那个问题, 假设洗牌后第一张牌是黑桃A(第一副牌的),第二张是红桃A(第二副牌的)和洗牌后第一张是黑桃A(第三副牌的),第二张是红桃A(第四副牌的),其余的牌都一样,是算两种还是算一种
发表于 2014-10-26 23:58:51 | 显示全部楼层
对了,知道四色问题吗,这个比那个简单多了
发表于 2014-10-27 10:01:04 | 显示全部楼层
回复 11# netegg


    其实你想的有点复杂了.  不管第一副还是第二幅的黑桃A, 它是两张不同的牌, 按楼主的意思,应该是把这两张牌的不同顺序排列作为两种不同的情况来做的.  所以,这个问题只是用 排列公式  对312取全排列. 也就是总共有312的阶乘个结果.
发表于 2014-10-27 10:30:15 | 显示全部楼层
本帖最后由 netegg 于 2014-10-27 10:34 编辑

回复 34# lanfengc
所以我才问lz,那种相同点数花色的牌的排序不管出自哪一副牌到底是算相同,还是算不相同
发表于 2014-10-27 10:46:15 | 显示全部楼层
我不是不知道怎么算,一个公式的事,但就是lz没说清楚到底是什么

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-10-27 11:08:56 | 显示全部楼层
回复 34# lanfengc
其实说白了就是lz要的是组合还是排列的问题
发表于 2014-10-27 11:14:43 | 显示全部楼层
楼主所谓的312张牌,那就是说无所谓了,反正是不同的,但是楼主又说有多少种,实在不清楚到底指望要什么
发表于 2014-10-27 11:16:32 | 显示全部楼层
楼主所谓的312张牌,那就是说无所谓了,反正是不同的,但是楼主又说有多少种,实在不清楚到底指望要什么
发表于 2014-10-27 11:28:50 | 显示全部楼层
回复 34# lanfengc

我想的是实际情况并非如此,即六副牌的黑桃a是一样的,其他也都类似,所以才问
不过好像有点想法了,随机取13次,然后再随机取6次,可能可以
发表于 2014-10-28 17:17:11 | 显示全部楼层
回复 40# netegg


下面是我的一点拙见, 不知道我这样理解对不对.

假设第一副牌的黑桃A, 用 [1][黑桃A]   表示 , 第二幅用  [2][黑桃A]  表示
....  以此类推,  第六副的 方块K  应该按照 黑红梅方 的顺序为 [6][方块K]

也就是用一个二维数组   定义为  扑克牌[6][52],  然后对数组的每个元素按照上面的格式赋值
再定义一个一维数组, 存放结果.  定义为  结果[313]=[0,0,....0]

无限循环, 每次循环分别取  0-5的随机数 (用x表示) 和 0-51的随机数(用y表示)各一个.
从二维数组中取出这个随机的结果, 保存到临时变量.
然后用随机数(x+1)*(y+1) 作为结果数组的下标.  
例如: x=3, y=39 , 那么  (x+1)*(y+1) = 160  
再判断 结果[160] 中存放的内容是否为0, 如果为0, 则把扑克牌[3][39]的元素赋值到 结果[160] 中.

随机结束, 赋值结束后, 再判断一维数组中的所有下标从1开始的元素是否有一个为0, 如果都不为0, 则证明一组数据随机成功, 退出循环. 显示结果.
发表于 2014-10-28 19:25:18 | 显示全部楼层
回复 41# lanfengc
就是不知道楼主到底要什么结果,如果只是牌的话,应该没这么复杂
发表于 2014-10-28 19:28:41 | 显示全部楼层
回复 41# lanfengc

而且我发现lz在思路上好像有点混乱
发表于 2014-10-28 20:28:51 | 显示全部楼层
Global $card[13]=["2","3","4","5","6","7","8","9","10","J","Q","K","A"],$color[4]=["黑","红","花","片"]
Dim $howmany=6
Global $all[52*$howmany]
$t=0
For $a=1 To $howmany
        For $b=0 To UBound($color)-1
                For $c=0 To UBound($card)-1
                        $all[$t]=$color[$b]&$card[$c]
                        $t+=1
                Next
        Next
Next
_Display()
$t=Random(1000,9999)
For $a=1 To $t
        $b=Random(0,UBound($all)-1)
        $c=Random(0,UBound($all)-1)
        If $b<>$c Then
                $str=$all[$b]
                $all[$b]=$all[$c]
                $all[$c]=$str
        EndIf
Next
_Display()

Func _Display()
        $str=""
        For $a=0 To UBound($all)-1
                $str&=$all[$a]&" "
                If Mod($a,UBound($card))=UBound($card)-1 Then $str&=@CRLF
        Next
        ConsoleWrite($str&@CRLF)
EndFunc
小区域随机变换,不知道结果是不是楼主想要的
 楼主| 发表于 2014-10-28 22:13:08 | 显示全部楼层
回复 44# kevinch


    两天不来,想不到回复那么多,我还是把我的问题,重新整理,在发一次吧。
做这个程序,是想模拟赌场,赌博的情形:

开始:六副牌全部放在一起打乱,开始洗牌,因为打乱了,所以牌的顺序也是随机的.相当于六副牌的组合,他就一共有312张。
牌洗好了,现在要开始赌博了,    第一张丢弃,第二张发给庄家,第二张发给闲家,对比大小,四个花色也对比, 只能出现三种结果(大,小,和局)

继续循环,第四张丢弃,第五张发给庄家,第六张发给闲家,对比大小,

最后输出的结果为,就是这104盘的大小结果,排列方法为,竖徘以七小局为一小局:比如下面








------------------------------------------

第八局开始,
大   小






---------------------------------
第十五局开始,
大   小      小
大   小
大   小
大   小
大   小
大   小
大   小
---------------------------------
这样的排列方式。(上面的大小,是对比出来的)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-5 17:17 , Processed in 0.072818 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表