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圈
- 我的程序有一个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,将一个复杂的问题完美地升华为一个简单的例子。我讨厌看到任何给定的马获胜几率的完整计算。概率经常让我头疼。你可能会从严格的数学角度来看是正确的(我没有资格判断)。但如果我进行实证测试,我无法发现这两种方法之间有任何明显的分布差异。我相信