以数组编号为变量返回循环内数组的内容

Posted

技术标签:

【中文标题】以数组编号为变量返回循环内数组的内容【英文标题】:Return Contents of Array Inside Loop with Array Number as Variable 【发布时间】:2021-11-05 15:31:00 【问题描述】:

我花了 2 多个小时来解决这个问题,但我仍然不明白它是如何工作的。

此代码假设遍历当前脚本文件夹中的所有 PNG 并放入 folder1 数组。

然后我需要在循环中随机生成数字,并从数组中随机挑选照片并返回照片文件名。

提前致谢。

echo 
cls
setlocal enableDelayedExpansion

set /a photos=1
for %%G in (*.png) do (set folder1[!photos!]=%%~G 
set /a photos+=1 )

set totaloutput=2

for /l %%x in (1, 1, %totaloutput%) do (

    set /a "_rand=(%RANDOM% * 20 /32768)+1"
    
    echo _rand is !_rand1!
    echo folder1 is "!folder1[%%_rand]!"
    echo folder1 is "!folder1[%_rand%]!"
    echo folder1 is %folder1[!_rand!]%
    
    )

最终代码:

echo off
cls
setlocal enableDelayedExpansion

set /a photos=1
for %%G in (*.png) do (
    set folder1[!photos!]=%%~G
    set /a photos+=1 )

set totaloutput=10

for /l %%x in (1, 1, %totaloutput%) do (
    set /a "_rand=(!RANDOM! * (%photos%-1) /32768)+1"
    
    echo _rand is !_rand!
    FOR %%G IN ("!_rand!") DO echo folder1 is "!folder1[%%~G]!"
)

输出样本:

_rand is 2
folder1 is "b2.png"
_rand is 6
folder1 is "b6.png"
_rand is 3
folder1 is "b3.png"
_rand is 3
folder1 is "b3.png"
_rand is 5
folder1 is "b5.png"
_rand is 6
folder1 is "b6.png"
_rand is 2
folder1 is "b2.png"
_rand is 3
folder1 is "b3.png"
_rand is 3
folder1 is "b3.png"
_rand is 6
folder1 is "b6.png"

【问题讨论】:

见Arrays, linked lists and other data structures in cmd.exe (batch) script 【参考方案1】:

您的代码有几个问题。

您需要对RANDOM 变量使用延迟扩展。除非您这样做,否则输出的每次迭代都将是相同的。随机计算还应该使用您的文件数,否则您将被限制为现有代码中的前 20 个文件。所以那行应该改成这个。

set /a "_rand=(!RANDOM! * %photos% /32768)+1"

因为你在一个带括号的代码块内,你基本上需要做两层扩展来获得数组的值。您有两种选择。

调用方法

CALL echo folder1 is "%%folder1[!_rand!]%%"

FOR 元变量。

FOR %%G IN ("!_rand!") DO echo folder1 is "!folder1[%%~G]!"

编辑: 您的代码中还有一个错误。如果目录中有一个文件,您的文件数将为两个。在创建数组变量之前,您需要将变量初始化为零并加一。

set /a photos=0
for %%G in (*.png) do (
    set /a photos+=1
    set folder1[!photos!]=%%~G
)

【讨论】:

感谢您指出错误。我已经更新了代码,但是随机发生器有时会在 %photos% 值之外再选择一个。我已经更新了这方面的主要帖子。 修改为如下解决问题,但我不确定是否有更合适的解决方案 set /a "_rand=(!RANDOM! * (%photos%-1) /32768)+1 " @mAzri,问题不在于随机码。它与文件数量的计算有关。即使目录中有一个文件,您的计数也将是 2。您需要将变量初始化为零。然后在创建数组变量之前在循环中添加一个。

以上是关于以数组编号为变量返回循环内数组的内容的主要内容,如果未能解决你的问题,请参考以下文章

JS 判断某变量是不是为某数组中的一个值 的几种方法

在Java中的循环内增加一个变量

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用bre(

如何在时间复杂度为大O(N)的循环内对数组部分求和

浅谈for each循环

浅谈for each循环