从10000到999999获取随机数很简单 我不知道如何做到这一点,大多数说明都没有用。 我批量相当新。
答案 0 :(得分:0)
@ECHO Off
:: Generate linear random number into variable %1
:: length is %2 digits
:: maxvalue %3 (optional. string of %2 9s if omitted)
:: minval %4 (optional, 0 if omitted)
:: to set minval but not maxval, use "" as %3
SETLOCAL ENABLEDELAYEDEXPANSION
SET $digits=%2
SET $maxval=%~3
SET $minval=%4
IF NOT DEFINED $digits GOTO :EOF
IF DEFINED $maxval GOTO maxvalset
:maxvallp
SET "$maxval=9%$maxval%"
IF "!$maxval:~%2!"=="" GOTO maxvallp
SET "$maxval=%$maxval:~1%"
:maxvalset
IF NOT DEFINED $minval SET /a minval=0
:minvallp
SET "$minval=0%$minval%"
IF "!$minval:~%2!"=="" GOTO minvallp
SET "$minval=%$minval:~1%"
:minvalset
SET "$chosen="
SET /a $count=%2
:getdigit
SET /a $digit=%RANDOM%
IF %$digit% gtr 32759 GOTO getdigit
SET /a $digit=%$digit:~-1%
SET "$chosen=%$chosen%%$digit%"
SET /a $count-=1
IF %$count% gtr 0 GOTO getdigit
IF "%$chosen%" gtr "%$maxval%" GOTO minvalset
IF "%$chosen%" lss "%$minval%" GOTO minvalset
:slzlp
IF %$chosen:~0,1%==0 IF %$chosen% neq 0 SET "$chosen=%$chosen:~1%"&GOTO slzlp
endlocal&set "%1=%$chosen%"
GOTO :EOF
这是一个例程,它将生成一个随机数,其线性分布为任意长度的最大值和最小值。
它的使用期望用户方面的一些情报。当然 - 要求一个0到99之间的数字然后加1会比要求1到100之间的数字快得多。它也不是防弹的,并且假定它所提供的参数是有效的。
每个步骤都是微不足道的 - 变量名称和标签应该为其目的提供适当的线索。本质上,如果超出范围,则构建并丢弃适当长度的一串随机数字。选择幻数32759
以确保选择作为生成数字基础的随机数为0..32759,假设随机数生成器是线性的,将产生线性分布mod 10.
答案 1 :(得分:-1)
虽然您可以在批处理文件中使用%RANDOM%
来获取随机数,但它将介于0和32767之间。
%RANDOM% * n / 32767
的传统方法不能为你提供n = 999999-10000 = 989999的平滑分布......它将覆盖范围,但会有很大的差距。
同样,您无法一起向%RANDOM%
添加大量调用,因为随机值的总和为not itself uniformly distributed。
我建议您切换到PowerShell 2.0,您可以在整个范围内使用Get-Random
Cmdlet。或者,或者用另一种语言编写一个简单的程序只是为了生成随机数,然后从批处理文件中调用它。
修改强>
您可以这样做以获得介于10000和999999之间的随机数:
set /a rnd=(((%random% * 32768) + %random%) %%990000) + 10000
它并不完全统一,但可能足以满足您的目的。
鉴于问题标题,也许您实际上正在寻找100000和999999之间的数字(即5或6位数)。在这种情况下,您可以使用:
set /a rnd=(((%random% * 32768) + %random%) %%900000) + 100000
与使用加法的方法不同,它使用两个随机数(一个用于高阶位,一个用于低阶位),这应该在0和1073741823之间给出均匀分布;非均匀性来自你从模数(%%
)操作得到的环绕。如果您使用循环并拒绝任何高于1073700000(= 900000 * 1193)的候选随机值,您也可以避免这种情况。