Board logo

标题: (已结)如何用批处理生成一个随机数 [打印本页]

作者: cheng059830     时间: 2005-8-16 22:39    标题: (已结)如何用批处理生成一个随机数

我想用批处理生成一个随机数.有方法可以实现.

---------- Edited by willsort  ----------
有以下方案:
1、直接引用环境变量 %random% (2楼),
     可用程序控制其生成位数(6,9,13楼)可在WinNT系列环境下
2、VBS脚本生成(4楼),可在Windows下使用
3、strings+LMOD(5楼),可在Windows和DOS下使用
4、纯批处理(9楼),可在Windows或DOS下使用
---------- Edited by willsort ----------


[ Last edited by willsort on 2005-8-19 at 16:14 ]
作者: 无奈何     时间: 2005-8-16 23:53
nt环境下可用扩展变量%random%
命令行下键入:echo %random% 看看。
详细信息键入:set /?
作者: cheng059830     时间: 2005-8-17 16:37
能不能详细说一下例子.
如果我需要生成1到100之间的随机数,应该怎样写.
作者: chenhui530     时间: 2005-8-17 17:49
DOS下我不知道
但是VBS倒是很简单
Dim MyValue, Response
Randomize   '初始化随机数生成器。
Do Until Response = vbNo
   MyValue = Int((6 * Rnd) + 1)   ' 产生 1 到 6 之间的随机数。
   MsgBox MyValue
   Response = MsgBox ("Roll again? ", vbYesNo)
Loop
作者: JonePeng     时间: 2005-8-17 21:41
%random%变量只适用于NT环境下,这时如果用Strings再配合LMOD则可以生成一个随机数。%random%的特点是随机产生一个0~32768之间的整数,因此用 strings 命令将%random%和327相除,就可以得到0~100的整数了。

...
strings div %random%,327 | Lmod set xyz=[] >tmp.bat
call tmp.bat >nul
del tmp.bat
...

这样就可以产生一个随机数到%xyz%,可以随时调用了。
可惜该方法不能在纯DOS和Win9x下通过。

[ Last edited by JonePeng on 2005-8-17 at 23:19 ]
作者: 无奈何     时间: 2005-8-18 11:42


  Quote:
Originally posted by cheng059830 at 2005-8-17 16:37:
能不能详细说一下例子.
如果我需要生成1到100之间的随机数,应该怎样写.

setlocal  ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,3) do (
                echo %random% >nul
                      set x%%i=!random:~-1!
)
set x=%x1%%x2%%x3%
echo %x%
作者: cheng059830     时间: 2005-8-18 17:37


  Quote:
Originally posted by 无奈何 at 2005-8-18 11:42:


setlocal  ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,3) do (
                echo %random% >nul
                      set x%%i=!random:~-1!
)
set x=%x1%%x2%%x3%
echo %x%

能不能说明一下"!random:~-1!"是什么意思.
谢谢.
作者: cheng059830     时间: 2005-8-18 18:18
已经明白"%random:~-1%"这个意思了.谢谢.
作者: willsort     时间: 2005-8-18 18:32
Re 无奈何:

      你给出的代码可以更简单些:
set x=%random:~-3%
echo Random number: %x%
另外,Win9x和DOS下获取随机数到环境变量可以参考 {8905}[分享]批处理编程的异类 3楼的代码。

[ Last edited by willsort on 2005-8-18 at 18:34 ]
作者: 无奈何     时间: 2005-8-19 00:24


  Quote:
Originally posted by cheng059830 at 2005-8-18 17:37:




能不能说明一下"!random:~-1!"是什么意思.
谢谢.

"!random:~-1!" 两个!!引起来的是延迟环境变量,详细见 set /?
作者: 无奈何     时间: 2005-8-19 00:29


  Quote:
Originally posted by willsort at 2005-8-18 18:32:
Re 无奈何:

      你给出的代码可以更简单些:
set x=%random:~-3%
echo Random number: %x%
另外,Win9x和DOS下获取随机数到环境变量可以参考 [ ...

版主就是版主利害。不过我不知道 %random%获得的随机数小于3位时会出现什么情况?我的确实笨了些。
作者: 无奈何     时间: 2005-8-19 00:42
顺便问一下:
我原先写的是这样:
setlocal  ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,3) do (
                echo %random% >nul
              set x=!random:~-1!
)
echo %x%
但只返回一位数,为什么用了延迟环境变量仍还不行,谁能给个解答?
作者: willsort     时间: 2005-8-19 16:06
Re  无奈何(12楼):

      因为你在循环中没有依次将 %random% 的最后一位除去,所以每次引用的都是 %random% 的相同的最后一位;同时,因为你多次引用了 %random%,而每次被引用的 %random% 都是不同的,所以不会组合得到最初的随机数的最后三位数。

      按照你的思路,我写了以下的代码。当然,程序的复杂是我起初想不到的,可见良好的算法和技巧可以省却很多编程上的无用功。目前,下面的代码处理三位数以下的随机数仍然是有错的,这源于 set 环境延迟对空变量的识别机制与我们想象的不同。
setlocal  ENABLEDELAYEDEXPANSION
set y=%random%
set x=
echo Old random number: %y%
for /l %%i in (1,1,3) do (
    if "%%i"=="1" (set x=!y:~-1!) else (set x=!y:~-1!!x!)
    set y=!y:~0,-1!
)
echo New random number: %x%

作者: 无奈何     时间: 2005-8-19 23:30
Re willsort版主 『第 13 楼』:  

谢谢版主的热心解答,我的原意是想累计获取3次不同的 %random%的最后一位,看了你的程序我才意识到我犯了逻辑错误,不知道我当初怎么想的。
你的代码处理三位数以下确实有错,我试了300次才总算找到一个:
Old random number: 87
New random number: ~-187
换了个思路重写了一下,应该没有问题了。
setlocal  ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,3) do (
call :loop               
)
echo %x%
goto :EOF

:loop
set x=!x!%random:~-1%
goto :EOF

作者: willsort     时间: 2005-8-21 18:20
Re 无奈何(14楼):

      既然如上,索性如下:
set x=%random:~-1%%random:~-1%%random:~-1%
echo New random number: %x%
[ Last edited by willsort on 2005-8-21 at 18:23 ]
作者: 无奈何     时间: 2005-8-21 23:44
我一直是在用 for 处理的, %random%的值总不刷新,总是同一值,搞的我实在没办法了,才想到跳出 for 来刷新 %random%的值。 费力不讨好。没想到原来可以这样轻松的完成,又多学了一点。
作者: spiegboy     时间: 2007-2-15 20:57    标题: 按照14楼哥们的思路扩展一下

@echo off
setlocal enabledelayedexpansion
set/p jj=情输入你想要生成的随机数的位数:
:start
set x=!x!%random:~-1%
set /a i+=1
if !i! neq !jj! goto start

echo New random number: %x%
pause>nul
作者: gne3     时间: 2007-2-17 05:06
顶啊
作者: qq43142691     时间: 2007-6-15 10:33
谢谢大家。。我正需要呢!
作者: kgdetg1127     时间: 2007-10-4 21:40
哇,太牛了。