アセンブリで提供された乱数生成手順を実装すると、半分の時間でゼロ除算エラーが発生し、残りの半分で完全に機能します。コードを適切に実装していると思いますが、どのように記述したかを説明します。
randomCompNum PROC
call Randomize ;Sets seed
mov eax,10 ;Keeps the range 0 - 9
call RandomRange
mov compNum1,eax ;First random number
L1: call RandomRange
.IF eax == compNum1 ;Checks if the second number is the same as the first
jmp L1 ;If it is, repeat call
.ENDIF
mov compNum2,eax ;Second random number
L2: call RandomRange
.IF eax == compNum1 ;Checks if the third number is the same as the first
jmp L2 ;If it is, repeat
.ELSEIF eax == compNum1 ;Checks if the third number is the same as the second
jmp L2 ;If it is, repeat
.ENDIF
mov compNum3,eax ;Third random number stored
ret
randomCompNum ENDP
これは、Visual Studio から提供された RandomRange の逆アセンブリです。
_RandomRange@0:
004019C1 push ebx
004019C2 push edx
004019C3 mov ebx,eax
004019C5 call _Random32@0 (4019A6h) ;<---- This function doesn't touch ebx
004019CA mov edx,0
004019CF div eax,ebx ;<---- That's where the error occurs
004019D1 mov eax,edx
004019D3 pop edx
004019D4 pop ebx
004019D5 ret
このエラーの原因を知っていますか?
独自の乱数ジェネレーターを作成したくなります。
RandomRange メソッドの背景:簡単です。Randomize でシードを設定し、10 を eax に移動すると、RandomRange が 0 から 9 の間で維持されます。これが、その関数について見つけたすべてのドキュメントです。