批处理中的 %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 值以跳过排除的数字
我正在尝试批量执行生成特定范围内随机数的任务,我已经使用下面列出的代码完成了该任务。
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 值以跳过排除的数字