上周五面试深圳某知名软件公司,竟然要机试,遇到这个奇葩题,问题 Q1 倒是简单。
Q2 加分项把我难住了,真想吐槽出面试题的脑子都在想什么...
偷偷拍照,回家后尝试用伪随机碰撞解题,暂时卡死中.....
有大神有更快速方法或思路?
程序描述:
一副完整纸牌有 52 张(无大小王),4 种不同花色,每种花色 13 张。我们用一个整数 m 表示出所有的 52 种情况,规则是:
m / 13: =0: 红心,=1: 方块,=2: 梅花,=3: 黑桃
m % 13: =0:2,=1:3,=2:4 .... =8:10,=9:J,=10:Q,=11: K,=12:A
比如:m = 15 表示:方块 4 m=38 表示:梅花 A
Q1:( 基础项 ) -- #这个简单#
我们希望用程序模拟 1 副扑克牌随机抽取 5 张,发给某人的过程。
发牌后需要排序:规则是:先按花色,再按点数。花色的大小顺序是:梅花、方块、红心、黑桃。点数的顺序是:2、3、4、…. 10、J、Q、K、A。
Q2:( 加分项 )
已知五次连续发牌结果如下:
1、方块 6、红心 7、黑桃 7、梅花 8、梅花 10
2、黑桃 9、黑桃 2、红心 10、红心 5、方块 Q
3、红桃 J、方块 K、黑桃 K、红心 3、黑桃 5
4、梅花 3、方块 A、黑桃 A、梅花 K、梅花 5
5、红心 A、红心 9、黑桃 J、黑桃 4、红心 K
请根据以上发牌顺序,尝试逆算分析下一次发牌结果(五张)
1
JamesR 2019-01-06 15:37:54 +08:00
如果 Q2 不是故意为难人,那么就是很简单是从 52 张牌里面减去已经发的,剩下的再用随机数发 5 张出来。
|
3
zk8802 2019-01-06 16:49:11 +08:00 via iPhone 1
部分(非密码学安全的)伪随机数生成器是可以通过产生的伪随机数序列计算出种子的。如果知道使用的语言和伪随机数生成函数的话,可以尝试反推。
简单的伪随机数生成器往往可以用 SMT 求解器(比如 Z3 )根据输出序列求出种子。 |
4
takato 2019-01-06 19:41:10 +08:00 1
= =吐槽向:Q2 看着有点累,为啥有“红心”又有"红桃"- -。。
所以 3-1 是“黑桃”的笔误还是“红心”的笔误= =? |
7
greed1is9good 2019-01-06 23:35:55 +08:00 via Android
@whosyours 是楼主想复杂了,明显就是一副牌连续发了 25 张,让计算接下来要发的 5 张,27 选 5。。。
|
8
whosyours OP @greed1is9good 我怎么感觉不像。。。唉,坐等电话通知,到时候直接问下面试官吧。。。
|