批处理中的 %random% 以及如何避免特定范围内的特定数字?

%random% in batch and how to avoid specific numbers within a specific range?

我正在尝试批量执行生成特定范围内随机数的任务,我已经使用下面列出的代码完成了该任务。

set /a setvar=%random% %% 100+0

另外还有一组数字也是要避免的,我自己至今无法实现。

我的意思是一个批处理文件,它会生成 1-100 之间的数字,但避免生成数字 10、20、30、40、50、60、70、80 和 90。

有什么解决办法吗?我很茫然。

这很容易实现:

@echo off
:GetNumber
set /a Number=%random% %% 100
set /a Remainder=Number %% 10
if %Remainder% == 9 if not %Number% == 99 goto GetNumber
set /a Number+=1
echo Random number is %Number%

首先,通过将随机数除以 100 来计算 0 到 99 范围内的随机数,并将余数分配给环境变量。

这个随机数除以10得到余数

如果这个余数是9,而这个数不是99,那么在最后一步加1之后,这个数就是10,或者20,或者30,……。因此,数字 9、19、29、39 ... 必须被 运行 整个计算再次忽略,并使用新的随机数。

@echo off
setlocal
:: set list of values that should be avoided
for /l %%N in (10,10,90) do (
    set "_%%N=."
)


    set /a setvar=%random% %% 100+1
    :: if value is in the list sums the set value with 
    :: random value between 0 and 9 getting modulus of 9 
    if defined _%setvar% (
        set /a setvar=setvar +  %random% %% 9 + 1
    )


echo %setvar%
@ECHO OFF
SETLOCAL
:GetNumber
set /a setvar=%random% %% 100 + 1
IF %setvar% neq 100 IF %setvar:~-1%==0 GOTO getnumber
echo Random number is %setvar%

GOTO :EOF

你说你不想生产 ?0 但你没说你不想 100。此过程生成时没有 (10 20 30 40 50 60 70 80 90)。如果您还想排除 100,则删除 IF %setvar% neq 100

对于 1-99 范围内的值,只需确保最后一位数字在 1-9 范围内

set /a "setvar=(%random% %% 100 / 10 * 10) + (%random% %% 9 + 1)"

或者,如果范围是 1-100,并且 100 必须包含在允许值列表中

set /a "x=%random% %% 91 + 1", "x=x+(x-1)/9", "x=x-x/100"

在这种情况下,源范围 1-91(即 1-100 除了有问题的数字)映射到目标范围 1-100 添加 adecuated 值以跳过排除的数字