如何生成介于00和FF之间但没有相等字符组合的随机值?

时间:2019-05-14 07:31:05

标签: batch-file

我希望是否可以在01和FD之间设置一个随机值 但是只要您使用random命令,它就会返回一个没有两个相同字母的值。...

因此,我将从随机变量的可能值中删除值00、11、22、33、44、55、66、77、88、99,AA,BB,CC,DD,EE,FF

有人可以帮助我吗?

3 个答案:

答案 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