2013-12-10 81 views
0

在我的代碼*中,我有一個簡單的隨機數生成器和幾個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.

回答

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

+0

沒有,整數運算工作正常 - 它應該給1和4之間的值。我同意使用模數要簡單得多,但原數學應該可以工作。 – dbenham

+0

謝謝你的回答!它現在正在工作,雖然它不能生成數字:4(小偷)......有什麼具體原因?編輯:沒關係,犯了一個錯字! – BatchHole

1

好吧,隨機數發生器的主要問題是使用!而不是%。除非你使用for循環,否則你將不需要這些。

取而代之的是:

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

只需使用這樣的:

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

我在cmd中進行了測試,它工作得很好。

要使用!您需要EnableDelayedExpansion然後使用這是for循環。

希望這有助於您的問題,

莫娜。

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

也許我錯了,但是,set numif class似乎並不正確

+0

哈哈感謝您的通知!我想我在做了一些錯誤測試之後忘了改變它... – BatchHole

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