作为我正在制作的计划的一部分,我希望能够在网格上“绘制”或“标记”随机点。在这样做时,我需要生成一个随机数(x)来确定绘图的数量 - 然后生成x代表坐标的不同随机数。目前我有以下代码:
@echo off
:obno
set /a r1=%random%
if %r1% gtr 10 goto obno else (
goto ob
)
:ob
for /L %%R in (1,1,%r1%) do set /a n%%R=%random%*240/32678+1
echo %r1%
echo %n1% %n2% %n3% %n4% %n5% %n6% %n7% %n8% %n9% %n10%
pause
这里发生的是我最终得到x相同的随机数而不是不同的
即。输出中:
5
108 108 108 108 108
所以任何帮助都将不胜感激!
答案 0 :(得分:1)
在一个循环中你应该使用延迟扩展,例如
SETLOCAL ENABLEDELAYEDEXPANSION and using !RANDOM! instead of %RANDOM%
和...
%RANDOM% gives you a random number between 0 and 32767.
使用下面的表达式,您可以将范围更改为您喜欢的任何内容(此处范围为[1 ... 100]而不是[0 ... 32767])。
SET /A test=%RANDOM% * 100 / 32768 + 1
以下将产生1~100之间的数字
set /a num=%random% %%100 +1
要在命令行上获取0到9之间的随机数,请使用
set /a "rand=%random% % 10"
如果在批处理文件中使用,则将模数运算符加倍
set /a "rand=%random% %% 10"
答案 1 :(得分:1)
使用您的代码,您可以使用call
并将%
加倍%%random%%
@echo off
:obno
set /a r1=%random%
if %r1% gtr 10 goto obno else (
goto ob
)
:ob
for /L %%R in (1,1,%r1%) do call set /a n%%R=%%random%%*240/32678+1
echo %r1%
echo %n1% %n2% %n3% %n4% %n5% %n6% %n7% %n8% %n9% %n10%
pause
答案 2 :(得分:0)
以下是在批处理文件中生成随机数的类似帖子
您需要在批处理文件的开头包含以下内容
setlocal EnableDelayedExpansion
Random variable not changing in "for" loop in windows batch file
答案 3 :(得分:0)
@ECHO OFF
SETLOCAL
:obno
set /a r1=%RANDOM% %% 10 + 1
:ob
for /L %%R in (1,1,%r1%) do CALL set /a n%%R=%%random%% %%%% 240 + 1
echo %r1%
echo %n1% %n2% %n3% %n4% %n5% %n6% %n7% %n8% %n9% %n10%
GOTO :EOF
由于%random%产生一个随机数0..32767,原始代码将浪费大量时间等待0到10之间的数字。此外,它可能会生成0。
%
运算符用于'模数'。在批处理中,您需要将其加倍,因此%random% %% 10
生成0..9
通过CALL
命令,您可以避免setlocal enabledelayedexpansion
的需要,但您还需要加倍使用的任何%
,因此random
加倍并翻两倍对于mod运算符。
setlocal
不是严格必要的,但它的作用是在批次结束时退出环境变化,因此r1,n1..n10在环境中根本不存在批次完成后。如果 OMIT setlocal
,那么在一次运行中设置的任何变量将为后续运行设置 REMAIN ,因此如果您的第一次运行设置为n5(因此也是n1 ..n4)然后,如果第二次运行设置r1 = 2,则n3..n5将显示上次运行的陈旧数据。
最后,如果你允许r1 = 0,那么由于没有设置n1..n10,echo %n1%...
命令将被解析为echo
,将显示echo
状态(回声开/关)。这可以通过使用语法echo(%n1%...
来克服。直接跟在O
之后的角色被发现做了一些奇怪的事情
例如,echo Dot 对于blak换行是传统的。 (
可能看起来很奇怪并且看起来“不平衡”嵌套,但是很高兴能够生成一个带有空参数的换行符。