如何在批处理文件中生成 4 位随机数?

Posted

技术标签:

【中文标题】如何在批处理文件中生成 4 位随机数?【英文标题】:How to generate 4 digit random numbers in a batch file? 【发布时间】: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 【参考方案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 之间的随机数

【讨论】:

以上是关于如何在批处理文件中生成 4 位随机数?的主要内容,如果未能解决你的问题,请参考以下文章

我想在批处理文件中生成一个介于 1 到 5 之间的数字 [重复]

excel中生成32位随机id

如何在 iPhone 的 xCode 中生成 3 位随机数

为啥java中生成32位随机ID永远不会重复?

如何在 GitLab YAML 文件中生成随机数

如何在R中生成随机的64位十六进制数?