【问题标题】:batch random number between 5 digit and 6 digit numbers5位和6位数字之间的批量随机数
【发布时间】:2016-02-09 15:38:43
【问题描述】:

简单到从 10000 到 999999 的随机数 我不确定如何执行此操作,并且大多数说明都不起作用。 我对批处理还很陌生。

【问题讨论】:

  • 当你看到它是如何完成时,这是你会踢自己的事情之一。具体来说,您已经尝试过哪些代码?你可能真的很亲密。
  • 这会创建一个在 10000 和 999563 之间平滑分布的随机数:set /A %random% * %random% / 1085 + 10000
  • @Aacini 这不是一个平滑的分布

标签: batch-file random numbers


【解决方案1】:
@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。

【讨论】:

    【解决方案2】:

    虽然您可以在批处理文件中使用%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) 的候选随机值,您也可以避免这种情况。

    【讨论】:

    • 所以你的“答案”的结论是这不能在批处理文件中完成?您可以在评论中说...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2017-02-07
    • 2018-12-21
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    相关资源
    最近更新 更多