这道题给我整不会了,求大神

2021-06-22 17:27:30 +08:00
 fescover
爆炸数游戏:
规定一个数字 n 作为爆炸数,x 名玩家从 0 开始轮流喊数,每人每次最多能说 m 个数,喊道爆炸数的那个玩家将输掉游戏。
当 n,x,m 不同时,每个玩家的输赢概率也不同,请写一个函数返回输掉游戏概率最大的玩家是第几位,返回结果为数字或者数组。
比如当 n=3,x=3,m=1 时,那么很显然游戏将这样进行:
玩家 1:0
玩家 2:1
玩家 3:2
玩家 1:3
那么玩家 1 输的概率为 100%,概率最大,结果返回数字 1
input:
n=3
x=3
m=1
output:
1
1588 次点击
所在节点    算法
11 条回复
Mithril
2021-06-22 17:48:45 +08:00
显然当 n<=m+1 的时候,第一个人胜率 100%,这时候输出啥?数组?
lidlesseye11
2021-06-22 17:53:30 +08:00
玩家是随机喊的吗?还是说每个玩家都是聪明绝顶的博弈大师,只会喊对自己最有利的数?
leaveeel
2021-06-22 17:58:23 +08:00
从 0 开始,一共 n+1 个数,ceil((n+1)/m)就是轮数 z,z%x 就是输的那个人
leaveeel
2021-06-22 18:01:33 +08:00
哦不是按数字顺序报数啊,那就是博弈论。上面就不对了
@leaveeel
konar
2021-06-22 18:03:17 +08:00
int t = (n / m + (n % m == 0 ? 0 : 1) + 1) % x;
return t == 0 ? x : t;

我理解的题意是 m == 3 时,玩家 1 喊出 0,01,012 的概率各为 1/3
画了个图,猜的当每人都按最多个数来喊时输掉的那个人的下一个人按随机喊输掉概率最大
kop1989
2021-06-22 18:06:47 +08:00
假设所有人智商在线,那么当所剩数字( n-已经喊的数字)<=m 的时候,下一个人必然输。
所以最优策略应该是保证( n-已经喊的数字)<=m 这个事件,不出现在自己的前一个人身上。

但是当 x>2 时,根本没法保证。
所以这并不是一个概率学问题,这是个博弈论问题。
Vegetable
2021-06-22 18:11:53 +08:00
描述感觉不太完整,这个题目看起来是脱胎于猜数字这个游戏,还不太一样。

我觉得还有以下约束

- 玩家并不知道目标数字是多少,因此玩家喊 1~m 个数字的概率是相等的
- 每个人每次至少要喊一个数字,至多 m 个数字,但是每次喊的必须比上一个数字大

这样的话,从 0 开始到喊道 n,可以出现的情况数量就是有限集合,可以穷举了。
Vegetable
2021-06-22 18:13:27 +08:00
如果玩家知道 n,概率就是不可计算的了。而如果 m 等于 1,则结果只可能有一种。
wjfz
2021-06-22 18:23:16 +08:00
岳云鹏最擅长这个。
coderluan
2021-06-22 18:23:21 +08:00
因为输家只有一个, 不输就全是赢家, 这样所有人只要脑子没屁, 每次都只会报 1, 不明白这个思路可以参考下俄罗斯轮盘, 只是想自己活的人, 绝对不会多对自己开一枪的, 那么结果实际是固定的, 求下余数就行了, 也就是当子弹放枪里的一刻, 谁死就已经注定了, 所以是这题出的明显有问题, 设计了个烂游戏.
palfortime
2021-06-22 19:09:52 +08:00
每轮从[1..m]的 m 个数选择,找出和为 n 的且最后一次选择是 1 的排列,以这些排列总数作为分母 s,s[i]作为第 i 个人输的排列总数(i 由 1 开始),对于每个排列长度 l,s[l%n] += 1,s[i]/s 就是第 i 个人输的概率。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/785134

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX