【问题标题】: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%

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

感谢任何帮助。

【问题讨论】:

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

标签: batch-file


【解决方案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】:
    1. 在第一种形式中,您必须考虑模数偏差,如本问题Why do people say there is modulo bias when using a random number generator? 中所述

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

    1. 在第一种和第二种形式中,它们的写入方式显示的值范围不正确。更多信息可以在这里找到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,你会偏爱一些数字而不是其他数字,你偏爱这些数字的数量取决于范围的大小您选择使用的值,但是此答案中提供的代码说明了这一点。您可以在此处查看更多详细信息:stackoverflow.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 到位。在这里可以找到更多信息:stackoverflow.com/a/5777608/3985011
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多