5位和6位数字之间的批量随机数
batch random number between 5 digit and 6 digit numbers
简单到得到一个从10000到999999的随机数
我不确定该怎么做,而且大多数说明都不起作用。
我对批处理还很陌生。
尽管您可以在批处理文件中使用 %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
与使用加法的方法不同,它使用两个随机数(一个用于 higher-order 位,一个用于 lower-order 位),它们应该在 0 到 1073741823 之间均匀分布; non-uniformity 来自您从模数 (%%
) 操作中获得的 wrap-around。如果您使用循环并拒绝任何高于 1073700000 (=900000 * 1193) 的候选随机值,您也可以避免这种情况。
@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。
简单到得到一个从10000到999999的随机数 我不确定该怎么做,而且大多数说明都不起作用。 我对批处理还很陌生。
尽管您可以在批处理文件中使用 %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
与使用加法的方法不同,它使用两个随机数(一个用于 higher-order 位,一个用于 lower-order 位),它们应该在 0 到 1073741823 之间均匀分布; non-uniformity 来自您从模数 (%%
) 操作中获得的 wrap-around。如果您使用循环并拒绝任何高于 1073700000 (=900000 * 1193) 的候选随机值,您也可以避免这种情况。
@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。