【问题标题】:How to generate 4 digit random numbers in a batch file?如何在批处理文件中生成 4 位随机数?
【发布时间】:2016-07-29 22:40:08
【问题描述】:

请给我在dos(批处理)文件中生成4位随机数的代码

我试过了

set /a num=%random% %%10000 +1

但这并不是每次都给出准确的 4 位数字。所以请帮助我。

【问题讨论】:

  • How to use random in BATCH script? 的可能重复项,对于您的上限,只需使用 9999
  • set /A NUM=%Random% %%10000 生成从09999 范围内的随机数;要始终有 4 位数字,您需要填充前导零:set NUM=000%NUM% & set NUM=%NUM:~,-4%;
  • @aschipfl 逗号太多:set NUM=%NUM:~-4%
  • @Stephan,你是对的,谢谢你的提示......
  • 0001 不是 4 位数字。它仍然是一个 1 位数字,但有 3 个填充 0

标签: batch-file windows-console


【解决方案1】:

只是为了增加另一种可能性:

echo %random:~-1%%random:~-1%%random:~-1%%random:~-1%

(从四个随机数中取最后一个数字)

【讨论】:

  • 与其他解决方案相比,这将提供更均匀的分布
  • 这将均匀性误差降低到每位数 0.03% (1 / 3276),但它仍然存在。
  • @RyanBemrose 没有程序员期望随机数(由算法生成)是真正随机的。
  • 是的,但是 1/3276 和使用伪随机生成器引入的 1/数十亿误差之间存在几个数量级的差异。后者是程序员永远不可能观察到的。前者可以通过花费 10 分钟来运行数千次计算。
  • 我不相信分布更均匀的说法。假设 %RANDOM% 具有不错的随机性,那么数字 0、1、2、3、4、5 的出现频率会比数字 6、7、8、9 的出现频率要小。但这是一步获得填充为 0 的 4 位数字的一种聪明方法。
【解决方案2】:

您没有说是否需要在整个范围内保持一致,或者您是否只需要一个快速的 4 位数字作为文件名。

一个超级快捷的方法是将你的范围限制在1000-9999

set /a num = %random% %% 9000 + 1000

如果你想要0000-9999 的完整范围,你可以取一个更大的数字并截断以得到最后四位数字,但前提是你必须保证至少有四位数字。为此,请在截断前将数字加 1000。

set /a num = %random% + 1000
set num=%num:~-4%

这仍然存在一致性问题。由于%random% 生成数字的方式,0000-2767 之间的数字将比2768-9999 之间的数字多出约 33%。

减少(但不是消除)此错误的一种方法是将多个%random% 调用的结果放在一起。

set num=%random:~-1%%random:~-1%%random:~-1%%random:~-1%

在这种情况下,数字 0-7 的可能性仍然比 8-9 高约 0.1%,这对于大多数情况来说已经足够了。

但是,如果您想完全消除错误,可以使用循环来完成。

:rndloop
set /a num = %random% + 1000
if %num% GEQ 31000 goto :rndloop
set num=%num:~-4%

此循环将始终为您提供 0000 到 9999 之间的均匀分布。

感谢@aschipfl、@Manuel、@Stephan 和 @Magoo,感谢他们在此处借用的部分答案。

【讨论】:

    【解决方案3】:

    试试这个:

    set random_number=%random:~-4%
    

    这将生成一个 4 位随机数

    【讨论】:

    • 并非总是如此。当%random% 生成一个只有一位或两位数字的数字时,那么“后四位”就不能有更多了。
    • 可以%random%%random%%random%%random%,然后从中获取最后四位数字。
    • @SomethingDark 这似乎有点矫枉过正。您可以在截断之前添加 1000。
    【解决方案4】:

    粗略地说,

    :rndloop
    set /a random_number=%random%+10000
    if %random_number% geq 40000 goto rndloop
    set "random_number=%random_number:~-4%"
    echo %random_number%
    

    如果你真的想要一个 0..9999 范围内的随机数,那么试试

    :rndloop
    set /a random_number=%random%
    if %random_number% geq 30000 goto rndloop
    set /a random_number=random_number/3
    echo %random_number%
    

    假设 %random% 在 0 到 32767 之间是线性的,那么必须忽略大于 29999 的数字,因为使用它们会使分布产生偏差:

    对于 %random%=800 或 10800 或 20800 将生成 800(可能 3 个)
    200 将生成 %random%=200 或 10200 或 20200 或 30200(可能有 4 个)

    【讨论】:

      【解决方案5】:

      试试这个:

      set num=0000%random%
      set num=%num:~-4%
      

      这将生成一个介于 0000 和 9999 之间的随机数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多