Batch file 批处理随机数发生器中的重复应答

Batch file 批处理随机数发生器中的重复应答,batch-file,if-statement,random,Batch File,If Statement,Random,在我的代码*中,我有一个简单的随机数生成器和一些ifs来检查生成器生成的数字。但是,即使在CMD的另一个实例、另一个批处理文件和该批处理文件的另一个实例中运行,它仍然会生成相同的数字:4。每一次。我不是在循环中使用这段代码,尽管它可以循环回它的部分。但是,我有另一行代码,可以在一组不同的参数中生成另一个数字,这组代码运行得很好 *我的代码: :genClass set /a class=(5 * !random!) / 32768 + 1 if !class!==1 ( set class=

在我的代码*中,我有一个简单的随机数生成器和一些ifs来检查生成器生成的数字。但是,即使在CMD的另一个实例、另一个批处理文件和该批处理文件的另一个实例中运行,它仍然会生成相同的数字:4。每一次。我不是在循环中使用这段代码,尽管它可以循环回它的部分。但是,我有另一行代码,可以在一组不同的参数中生成另一个数字,这组代码运行得很好

*我的代码:

:genClass
set /a class=(5 * !random!) / 32768 + 1
if !class!==1 (
  set class=Knight
  goto genKnightArmor
)
if !class!==2 (
  set class=Warrior
  goto genWarriorArmor
)
if !class!==3 (
  set class=Archer
  goto genArcherArmor
)
if !class!==4 (
  set class=Thief
  goto genThiefArmor
)
if !class!==5 (
  set class=Mage
  goto genMageArmor
)

:genKnightArmor
set /a armor=(2 * !random!) / 32768 + 1
if !armor!==1 set armor=Light Armor
if !armor!==2 set armor=Heavy Armor
echo !name!
echo !gender!
echo !class!
echo !armor!
pause
exit

:genWarriorArmor
set /a armor=(2 * !random!) / 32768 + 1
if !armor!==1 set armor=Light Armor
if !armor!==2 set armor=Heavy Armor
echo !name!
echo !gender!
echo !class!
echo !armor!
pause
exit

:genArcherArmor
set /a armor=(2 * !random!) / 32768 + 1
if !armor!==1 set armor=Light Armor
if !armor!==2 set armor=Heavy Armor
echo !name!
echo !gender!
echo !class!
echo !armor!
pause
exit

:genThiefArmor
set /a armor=(2 * !random!) / 32768 + 1
if !armor!==1 set armor=Light Armor
if !armor!==2 set armor=Heavy Armor
echo !name!
echo !gender!
echo !class!
echo !armor!
pause
exit

:genMageArmor
set /a armor=(3 * !random!) / 32768 + 1
if !armor!==1 set armor=Light Armor
if !armor!==2 set armor=Heavy Armor
if !armor!==3 set armor=Robes and Hood
echo !name!
echo !gender!
echo !class!
echo !armor!
pause
exit
编辑:使用Monacraft的解决方案,它现在可以生成2个数字,并且可以无误地生成护甲类型。但是,生成类的代码仍然混乱不堪,如前所述,继续生成数字2

编辑:我再次编辑了代码以更改算术和字符串变量名。这并没有清除任何内容,尽管类生成器现在正在连续生成数字3。我注意到,当编辑时,生成器生成一个新的数字,尽管在第一代之后,它生成相同的数字


编辑:修复了我代码中的错误。例如匹配变量并将随机数生成器中的数字4更改为5。

好的,随机数生成器的主要问题是使用
而不是
%
。除非您使用
for
循环,否则不需要这些

与此相反:

set /a num=(4 * !random!) / 32768 + 1
简单地说:

set /a num=(4 * %random%) / 32768 + 1
我在cmd中进行了测试,效果很好

使用
您需要
启用delayedexpansion
,然后使用这是一个for循环

希望这有助于解决你的问题


蒙纳。

问题在于你的表情

set /a num=(4 * !random!) / 32768 + 1
批处理数学仅为整数,因此将失败

试一试

更好的方法是,尝试主代码

call :roll armor 3
并在代码末尾添加

REM Roll 1..%2
:ROLL
set /a %1=(%random% %% %2) + 1
GOTO :EOF
请仔细注意冒号所在的位置-它们非常重要

call :roll somevar n
将随机数1..
n
分配给变量
somevar

set /a num=(4 * %random%) / 32768 + 1
if !class!==1 (

也许我错了,但是,
set num
如果class
看起来不正确,这里有另一种选择方法:

@echo off
:genClass
set name=Slartibartfast
set gender=Alien
set /a num1=%random% %% 5 + 1

set /a num2=%random% %% 2 + 1
if %num1%==1 (
  set class=Knight
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
)

set /a num2=%random% %% 2 + 1
if %num1%==2 (
  set class=Warrior
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
)

set /a num2=%random% %% 2 + 1
if %num1%==3 (
  set class=Archer
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
)

set /a num2=%random% %% 2 + 1
if %num1%==4 (
  set class=Thief
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
)

set /a num2=%random% %% 3 + 1
if %num1%==5 (
  set class=Mage
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
  if %num2%==3 set armor=Robes and Hood
)

echo %name%
echo %gender%
echo %class%
echo %armor%
echo.
pause
goto :genclass

不,整数数学很好——它应该给出一个介于1和4之间的值。我同意使用模要简单得多,但是原始的数学应该可以。谢谢你的回答!它现在正在工作,尽管它没有生成数字:4(小偷)。。。有什么具体原因吗?编辑:没关系,打错了!哈哈,谢谢你的通知!我想我在做了一些bug测试之后忘了更改它。。。
@echo off
:genClass
set name=Slartibartfast
set gender=Alien
set /a num1=%random% %% 5 + 1

set /a num2=%random% %% 2 + 1
if %num1%==1 (
  set class=Knight
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
)

set /a num2=%random% %% 2 + 1
if %num1%==2 (
  set class=Warrior
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
)

set /a num2=%random% %% 2 + 1
if %num1%==3 (
  set class=Archer
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
)

set /a num2=%random% %% 2 + 1
if %num1%==4 (
  set class=Thief
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
)

set /a num2=%random% %% 3 + 1
if %num1%==5 (
  set class=Mage
  if %num2%==1 set armor=Light Armor
  if %num2%==2 set armor=Heavy Armor
  if %num2%==3 set armor=Robes and Hood
)

echo %name%
echo %gender%
echo %class%
echo %armor%
echo.
pause
goto :genclass