如何使用其中的变量制作随机数变量?

Posted

技术标签:

【中文标题】如何使用其中的变量制作随机数变量?【英文标题】:How to make random number variable with variables within it? 【发布时间】:2021-02-13 20:46:30 【问题描述】:

所以我一直在尝试编写以下代码:

set /a num1=10
set /a num2=%random% %%60 +%num1%
echo %num2%

(这是简化的)

对于此代码,我需要将 +%num1% 作为变量,因为我需要能够更改最小的数字。

出于某种原因,它没有给我一个随机数,而是给了一个完全不相关的数字,这也不是随机的,但每次都是一样的。我的第一个想法是它可能是添加第二个变量而不是制作随机数。但事实并非如此,我不确定如何解决此问题。

我也试过下面的代码:

set /a num1=10
set /a num2=(%random%*60/32768)+%num1%
echo %num2%

这段代码的问题是,即使没有变量,它似乎也永远无法作为随机发生器工作。

感谢任何帮助。

【问题讨论】:

我想你可以在这里应用答案***.com/a/5777608/2894590 批处理很有趣,所以你可能需要空格并且不要使用括号。 您应该使用+ num1,而不是+%num1%。例如set /a "num2=(%RANDOM% %% 60) + num1" 另外,哪个版本的 windows?由于早期版本的工作方式不同。 @CookieButter 我有最新版本的 Windows 10... 也许我输入错误。我也相信这可能有效,我会尝试的。 【参考方案1】:

这里有一些例子可以帮助你:

Set "num1=10"
Set /A "num2 = (%RANDOM% %% 60) + num1"
Echo(%num2%
Set "num1=10"
Set /A "num2 = (%RANDOM% * 60 / 32768) + num1"
Echo(%num2%

请注意,我们只提供了您的批处理文件的一小部分,因此如果此代码是带括号的块的一部分,您可能需要启用延迟扩展并使用 !RANDOM! 并可能分别是!num2! 而不是%RANDOM%%num2%

【讨论】:

【参考方案2】:
    在第一种形式中,您必须考虑模数偏差,如本问题Why do people say there is modulo bias when using a random number generator? 中所述

(注意:接受的答案有一个缺陷,我在对该问题的回答中指出并提供了解决方案。)

    在第一种和第二种形式中,它们的写入方式显示的值范围不正确。更多信息可以在这里找到How to use random in BATCH script?

长话短说:

在这两种形式中,如果您希望范围从 10 开始到 60,则需要将其调整为使用 50 的模数,在第一种形式中,您必须在计算中考虑模数偏差,从而导致一些数字更频繁地出现。

第一种形式可以用这种方法固定:

SET "Min=10"
SET "Max=60"
SET /A "Discard= 32768 - ( ( ( 32768 %% (Min-Max) ) + 1 ) %% (Min-Max) )"
:Rand
  SET /A "num2=%random%"
  IF %num2% GTR %Discard% GOTO :Rand
SET /A "num2= num2 %% (Min-Max) + Min"
echo=%num2%

第二种形式可以用这个方法修复:

SET "Min=10"
SET "Max=60"
SET /A "num2= %random% * ( Max - Min + 1 ) / 32768 + Min "
echo=%num2%

完整脚本示例:

@(SETLOCAL
  ECHO OFF
)

CALL :Main

( ENDLOCAL
  EXIT /B
  pause
)

:Main
  SET "Min=10"
  SET "Max=60"
  SET /A "Discard= 32768 - ( ( ( 32768 %% (Min-Max) ) + 1 ) %% (Min-Max) )"
  ECHO=Form1:
  CALL :Form1
  ECHO=Form2:
  CALL :Form2
  pause

GOTO :EOF

:Form1
  SET "num2=%random%"
  IF %num2% GTR %Discard% GOTO :Form1
  SET /A "num2= num2 %% ( Min - Max ) + Min"
  echo=%num2%
GOTO :EOF

:Form2
  SET /A "num2= %random% * ( Max - Min + 1 ) / 32768 + Min "
  echo=%num2%
GOTO :EOF

结果:

C:\WINDOWS\system32>C:\Admin\SE\testrandom.cmd
Form1:
10
Form2:
31
Press any key to continue . . .

C:\WINDOWS\system32>

【讨论】:

这些都不起作用。我将他们两个sepretley复制并粘贴到他们自己的批处理文件中,第一个总是导致-40,第二个总是导致30。也许我错过了一些东西,或者除了基本的@之外我还需要一些额外的代码987654329@ 和pause >nul。此外,代码set /a num2=%random% %%60 +1 中是否存在缺陷。因为我一直把它用作随机发生器,它一直有效,但最近它一直不起作用。它会在 80% 的时间给出正确的数字,但其余的它会给出比最大值高一点的数字。 @VictorChavez 我使用了错误的形式,因为 %= 在此用法中无法按预期工作。我更改为SET /A "num2= num2 %% ( Min - Max ) + Min",这使该过程变得明确。我也放入了我用来测试它的实际 cmd 脚本以及结果输出。 @VictorChavez 至于你的声明,Also, is there imperfections in the code set /a num2=%random% %%60 +1. Because I have always used this 是一对。一方面存在模数偏差,另一方面,范围将使用您的原始代码产生不正确的值。 @VictorChavez 至于第 1 部分,模数偏差,也就是说,如果你想要 1 到 60,你会偏爱一些数字而不是其他数字,你偏爱这些数字的数量取决于范围的大小您选择使用的值,但是此答案中提供的代码说明了这一点。您可以在此处查看更多详细信息:***.com/a/46991999/3985011 @VictorChavez 至于你提到的第 2 部分It'll give the proper number 80% of the time but the rest it will give number a bit higher than the max。是的,这是因为您要选择 0 到 60 之间的数字,然后加 10,如果您希望数字介于 10 和 70 之间,这是可以的,但如果您希望数字介于 10 和 60 之间,则不行。这就是为什么我提供的代码使用 min 和 Max 变量来确保正确的 min 和 max 到位。在这里可以找到更多信息:***.com/a/5777608/3985011

以上是关于如何使用其中的变量制作随机数变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Prometheus 作为数据源制作带有变量引用另一个变量的 Grafana 模板?

如何测试一个变量设置为随机的 Apollo 突变?

Django如何在src标签中使用变量

如何在调用后删除一个列表变量?

如何在数组中使用多个变量

使用 C#,如何将变量设置为范围内的随机数? [复制]