Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 带有随机、概率或bug的批脚本问题_Batch File_Random_Probability_Probability Theory - Fatal编程技术网

Batch file 带有随机、概率或bug的批脚本问题

Batch file 带有随机、概率或bug的批脚本问题,batch-file,random,probability,probability-theory,Batch File,Random,Probability,Probability Theory,请原谅任何错误,这是我的第一篇帖子!最近,我很无聊,正试图制作一个我曾经看过的街机游戏的批量脚本克隆: 规则 我记不起规则了,希望公平,所以我自己制定了规则 每匹马都有一个介于1和6之间的数字 这个数字(x)是马每转一圈移动的几率(1/x) 马1=1/1,因此每转一圈都会移动 马3=1/3,因此平均每三圈移动一次 马6=1/6,因此平均每六圈移动一次 这个数字(x)还指示了马如何沿着棋盘移动 马1=每次移动1个空格 马术3=每次移动3格 马6=每移动6格 游戏板长60格,第一匹达到6

请原谅任何错误,这是我的第一篇帖子!最近,我很无聊,正试图制作一个我曾经看过的街机游戏的批量脚本克隆:

规则

我记不起规则了,希望公平,所以我自己制定了规则

  • 每匹马都有一个介于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几乎从来没有赢过。现在,这可以用概率来解释,但我想检查一下,所以我修改了代码,以便随着时间的推移跟踪结果,并发现编号越高的马获胜的频率越高

我上传了一个图表(),显示了三组1000场比赛的获胜者的结果,在这三组比赛中允许平局(并将所有完成的比赛都算作胜利)。现在,这种行为并不一定是坏事,这意味着每匹马都有机会,但我不明白为什么会这样

原因

在我看来,出现这种行为的原因有三个:

  • 我的程序有一个bug。如果您感兴趣,我已经在下面添加了代码
  • 批次随机性与时间有关,这会扭曲结果,使更高的数字更有可能出现。为了测试这一点,我收集了三组1000个介于1和6之间的随机数,结果似乎不错。
    • 注1:不同生成数字的时间:
    • 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
@ECHO关闭
颜色0B
setlocal EnableDelayedExpansion
设置总数=0
设置totalscore[0]=0
设置totalscore[1]=0
设置totalscore[2]=0
设置总分[3]=0
设置totalscore[4]=0
设置总分[5]=0
设置总分[6]=0
:开始
集合/a总计=总计+1
设置分数[0]=0
设置分数[1]=0
设置分数[2]=0
设置分数[3]=0
设置分数[4]=0
设置分数[5]=0
设置分数[6]=0
设胜利者=0
:循环
cls
回音比赛号码:%total%
对于(1,1,6)do中的/l%%n(
set/a num=!random!%%%n+1
如果!num!=%%n设置/a分数[%%n]=!分数[%%n]!+!num!

计算中的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
rem生成范围为[1-%%%n]的数字
set/a num=!random!*%%n/32767+1

rem如果马的数量是问题归结为概率

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

  • 马1将在6步中完成,然而马6有5次尝试以1/6的几率击败它

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


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

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

…也可以通过以下方式获得:

set /a "num=!random! * %%n >> 16 + 1"
set /a num=!random! %% %%n + 1
如果使用%random%的余数(模数)乘以数字n,则如下所示:

set /a "num=!random! * %%n >> 16 + 1"
set /a num=!random! %% %%n + 1
…然后你会得到一个完全不同的未知分布,它可能偏向于某个值


生成一个均匀分布的变量并不容易,因此您应该充分利用用于生成%random%变量的方法,而不要更改其原始分布。

啊,我认为这是因为我以一种奇怪的方式计算赔率…
set/a num=!random!%%%%n+1
其中%%n是循环数,所以对于马来说1,它将是1,对于马2,它将在1和2之间,…,马6在1和6之间。然后根据马数检查是否相等。我想我们已经解决了原因,我认为这是一个概率怪癖。马6有机会在马2所需的最少移动次数之前完成。不。你的计算是正确的。我想e看到%%n并自动考虑人口(马的数量),而不是马的数量。请查看更新的答案。只是使用%random%和批计算进行sintax的问题。
set/a num=!random!%%%n+1
此语法正确(但有点不可读)。它将得到模量%%n。我将更新这个问题,谢谢你的帮助!Npcmaka-这是我今天第二次看不到明显的东西。+1,将一个复杂的问题完美地升华为一个简单的例子。我讨厌看到任何给定的马获胜几率的完整计算。概率经常让我头疼。你可能会从严格的数学角度来看是正确的(我没有资格判断)。但如果我进行实证测试,我无法发现这两种方法之间有任何明显的分布差异。我相信