【问题标题】:Batch - Random Number thing批处理 - 随机数事物
【发布时间】:2013-01-25 09:36:26
【问题描述】:

我正在尝试创建一个组成随机 DOB 的批处理文件。

@echo off
title Random DOB Generator!
echo Working...
echo.
:loop
set dd=%random%
if "%dd%" GTR 31 goto loop
if "%dd%" LSS 1 goto loop
:loop2
echo %dd%/??/????
echo.
:loop2a
set mm=%random%
if "%mm%" GTR 12 goto loop2a
if "%mm%" LSS 1 goto loop2a
:loop3
echo %dd%/%mm%/????
echo.
:loop3a
set yyyy=%random%
if "%yyyy%" GTR 2000 goto loop3a
if "%yyyy%" LSS 1900 goto loop3a
:win
echo.
echo Result: %dd%/%mm%/%yyyy%
pause > nul
exit

但它什么也没做,它只是坐在那里。我做错了什么?

感谢您的帮助!

【问题讨论】:

    标签: random batch-file


    【解决方案1】:

    问题在于您如何生成随机数。

    %random% 返回一个介于 0 和 32767 之间的数字,因此尝试生成介于 1 和 31、1 和 12 以及 1900 和 2000 之间的数字将需要一些时间。

    它没有做任何事情,只是需要很长时间才能找到看起来像那样的匹配数字。

    您可以使用一些数学来找到某个范围内的数字,因此您不必等待。

    @echo off
    title Random DOB Generator!
    echo Working...
    echo.
    set /a dd=%random% * 31 / 32768 + 1
    echo %dd%/??/????
    echo.
    set /a mm=%random% * 12 / 32768 + 1
    echo %dd%/%mm%/????
    echo.
    set /a yyyy=%random% * (2000 - 1900 + 1) / 32768 + 1900
    echo.
    echo Result: %dd%/%mm%/%yyyy%
    pause >nul
    exit
    

    如果您从原始脚本中删除@echo off,我想您会看到它生成了多少数字来找到匹配项:)

    【讨论】:

    • 您还可以通过模运算符% 使用模运算。这样就不需要指定32768 的最大随机值。只需指定所需的最大值31,这将返回1 to 31:) set /a Value=(%Random% % 31) + 1 要使用自定义最小值和最大值范围,请使用以下设置。 set /a Value=(%Random% % (2000 - 1900)) + (1900 + 1) 或为简单起见set /a Value=(%Random% % 100) + 1901
    • 没有。 %random% 返回的数字(假设)均匀分布在 0-32767 范围内。当您将其除以 32768 并乘以所需范围时,新数字在新范围内具有相同的分布。 %random% 的模数有一个未知的分布,当然它比原来的差。这意味着您会更频繁地获得重复的数字。
    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2021-07-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多