批量随机数发生器中的重复应答

时间:2013-12-10 04:34:33

标签: batch-file if-statement random

在我的代码*中,我有一个简单的随机数生成器和几个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。

4 个答案:

答案 0 :(得分:1)

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

而不是:

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

只需使用:

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

我在cmd中对此进行了测试,但效果很好。

要使用!,您需要EnableDelayedExpansion,然后使用它是for循环。

希望这有助于解决您的问题,

莫纳。

答案 1 :(得分:1)

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

也许我错了,但set numif class似乎不正确

答案 2 :(得分:0)

问题在于你的表达

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

批次数学仅为整数,因此会失败。

尝试

set /a num=(%random% %% 4) + 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

答案 3 :(得分:0)

这是另一种选择方式:

@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