我希望是否可以在01和FD之间设置一个随机值 但是只要您使用random命令,它就会返回一个没有两个相同字母的值。...
因此,我将从随机变量的可能值中删除值00、11、22、33、44、55、66、77、88、99,AA,BB,CC,DD,EE,FF >
有人可以帮助我吗?
答案 0 :(得分:2)
如果您得到不想要的值之一(后面是伪代码),那么简单的方法就是重试:
do
val = random(0..255)
while val is a multiple of 17
假设您正在谈论cmd.exe
,则可以通过以下方式完成:
@echo off
rem Get a valid number.
:try
set /a "xx = %random% %% 256"
set /a "rem17 = %xx% %% 17"
if %rem17%==0 goto :try
rem Output it as hex
echo >tmp.vbs WScript.Echo Hex(WScript.Arguments(0))
cscript /nologo tmp.vbs %xx%
del tmp.vbs
有许多方法可以做到 ,而无需多次尝试(事先进行一些设置),但是鉴于您使用的是cmd
,我怀疑性能不佳不是一个大问题:-)
答案 1 :(得分:2)
您可以使用一个简单的公式来避免17的倍数(并完全避免循环)。
诀窍是除以16(而不是17),因为每个 serie 只有16个连续值。
@echo off
set /a val=1 + ( %random% %% 240 )
set /a sane=(val - 1) / 16 + val
call :dec2hex %sane%
echo %hex%
exit /b
:dec2hex
setlocal EnableDelayedExpansion
set /a nibbleHigh=%1 / 16
set /a nibbleLow=%1 %% 16
set "hexMap=0123456789ABCDEF"
set "hex=!hexMap:~%nibbleHigh%,1!!hexMap:~%nibbleLow%,1!"
(
endlocal
set "hex=%hex%"
exit /b
)
答案 2 :(得分:2)
与paxdiablo的答案中的数学相同,但以纯cmd
(不带vbs
)转换为十六进制:
:loop
set /a val=%random% %% 256
set /a chk=val %% 17
if %chk%==0 goto :loop
call cmd /c exit /b %val%
echo %=exitcode:~-2%
goto :loop