3

如有错误请见谅,这是我的第一篇文章!最近我很无聊,正试图制作一个我曾经看过的街机游戏的批处理脚本克隆:http: //antikrish.com/2013/01/28/whittakers-ascot-gold-cup-horse-racing-arcade-game /

规则

我不记得规则并希望它是公平的,所以我自己做了。

  • 每匹马都有一个介于 1 和 6 之间的数字
  • 这个数字 (x) 是马每回合移动的机会 (1/x)
    • 马 1 = 1/1 所以每回合移动
    • 马 3 = 1/3 所以平均每三圈移动一次
    • 马 6 = 1/6 所以平均每六圈移动一次
  • 这个数字 (x) 也决定了马在棋盘上的移动方式
    • 马 1 = 每次移动 1 格
    • 马 3 = 每次移动 3 个空格
    • 马 6 = 每次移动 6 格
  • 棋盘长 60 格,第一个达到 60 格的马为获胜者(允许平局)。选择 60 作为目标,因为它是 1、2、3、4、5 和 6 的公倍数。
  • 这样做的想法是每匹马需要大约 60 圈才能到达终点并获胜。
    • 马 1 => 60 格 / 1 移动 = 60 转,60 转 / (1/1) = 60 转
    • 马 3 => 60 格 / 3 移动 = 20 回合,20 回合 / (1/3) = 60 回合
    • 马 6 => 60 格 / 6 移动 = 10 转,10 转 / (1/6) = 60 转

问题

我运行了游戏,一切似乎都很好!过了一会儿,我注意到马 1 几乎从来没有赢过。现在这可以用概率来解释,但我想检查一下,所以我修改了我的代码以跟踪结果,并看到编号越高的马越经常获胜!

我上传了一张图表(http://i.imgur.com/IZuXnye.png),显示了三组 1000 场比赛的获胜者的结果,其中允许平局(并且所有完成的比赛都算作胜利)。现在,这种行为不一定是坏事,这意味着每匹马都有几率,但我对为什么会发生这种情况感到困惑。

原因

在我看来,为什么会发生这种行为有三个原因:

  • 我的程序中有一个错误。如果您有兴趣,我已经包含了下面的代码。
  • 批次随机与时间有关,这会扭曲结果,使更高的数字更有可能。为了测试这一点,我收集了三组 1000 个介于 1 和 6 之间的随机数,结果看起来还不错。
    • 注意我改变了生成数字之间的时间:
    • REM – 一代之间没有时间间隔
    • 0 秒 - 超时 0 秒(所以短暂的停顿)
    • 1 秒 - 超时 1 秒
  • 这是概率和收益的属性,我使用的逻辑对于公平游戏来说是有缺陷的。

那么,谁能告诉我为什么会发生这种情况?

提前致谢!

如果有帮助,这里是代码:

@ECHO OFF
COLOR 0B
setlocal EnableDelayedExpansion
set total = 0
set totalscore[0]=0
set totalscore[1]=0
set totalscore[2]=0
set totalscore[3]=0
set totalscore[4]=0
set totalscore[5]=0
set totalscore[6]=0

:START
set /a total = total + 1
set score[0]=0
set score[1]=0
set score[2]=0
set score[3]=0
set score[4]=0
set score[5]=0
set score[6]=0
set winner=0

:LOOP
cls
echo Race Number: %total%
for /l %%n in (1,1,6) do (
    set /a num=!random! %%%%n + 1
    IF !num! == %%n set /a score[%%n]=!score[%%n]! + !num!
    <NUL set /p=%%n: 
    for /l %%x in (1, 1, !score[%%n]!) do <NUL set /p=^|
    set /a sum=60 - !score[%%n]!
    for /l %%x in (1, 1, !sum!) do <NUL set /p=_
    echo F
) 
for /l %%n in (1,1,6) do (
    if !score[%%n]! == 60 (
        echo winner: %%n
        set /a totalscore[%%n]=!totalscore[%%n]! + 1
        set winner=1
    )
) 

echo.
echo Previous Results
for /l %%n in (1,1,6) do (
    echo %%n: !totalscore[%%n]!
) 

if %winner%==1 GOTO END
timeout /t 0 /nobreak > NUL

GOTO LOOP

:END
echo.
pause

GOTO START

编辑我认为这是一个概率怪癖,因为马 6 有机会在 10 回合后完成,而所有其他马物理上都做不到。这为每匹马加起来,减少了低于它的马匹的机会(即,只有在另一匹马表现不佳时,马 1 才会获胜)。

感谢您的回复:)

4

3 回答 3

3

问题归结为概率!

如果我们将游戏简化为 6 步:

  • 马 1 将在 6 步内完成,但是马 6 有 5 次尝试以 1/6 的机会击败它。

  • 马 6 未完成的几率 = (5/6)^5 = 0.40 因此马 6 完成 5 步或更少的几率为 0.6

如果我们对每匹马都这样做,那么可怜的马 1 就没有机会了!

于 2013-10-28T16:57:32.800 回答
1

calcs 中的 Sintax 不正确。请改为

rem Generate a number in range [1-%%n]
set /a num=!random! * %%n / 32767 + 1

rem if horse number is <= random then move horse 
if !num! GEQ %%n set /a score[%%n]=!score[%%n]! + %%n

%random% 返回一个 0 到 32767 之间的数字

于 2013-10-28T16:17:31.953 回答
1

%random% 变量返回一个假设均匀分布在 0 到 32767 之间的数字,因此获得具有相同分布的1 到 n 之间的数字的正确方法是:

set /a num=!random! * %%n / 32768 + 1

...也可以通过这种方式获得:

set /a "num=!random! * %%n >> 16 + 1"

如果您以这种方式使用数字 n 的 %random% 的余数(模数):

set /a num=!random! %% %%n + 1

...然后您会得到一个完全不同且未知的分布,该分布可能会偏向某个值。

均匀分布的随机数的生成并不容易,所以要善用生成 %random% 变量的方法,不要改变其原来的分布。

于 2013-10-28T18:02:05.273 回答