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