【问题标题】:Increase amount of numbers for picking randomly增加随机选择的数字数量
【发布时间】:2022-01-05 22:28:25
【问题描述】:

有一个批处理文件在 list.txt 中查找 Pen=n 并从给定的十个数字行中随机更改其值 (n) (set "var[pen]=1 2 3 4 5 6 7 8 9 10")。但是如果有十多个数字说二十(设置“var [pen] = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20”)或一百,它仍然是从前十个忽略其余的。

@echo off
setlocal EnableDelayedExpansion

set "file=D:\list.txt"
set "temp=D:\temp.txt"
set "var[pen]=1 2 3 4 5 6 7 8 9 10" &

for /L %%i in (1,10,1%time:~-2%) do set "rand=!random!"

(for /F "usebackq tokens=1,2 delims==" %%a in ("%file%") do (
   if defined var[%%a] (
      call :getRandomValue var="!var[%%a]!"
      echo %%a=!var!
   ) else if "%%b" neq "" (
      echo %%a=%%b
   ) else (
      echo %%a
   )
)) > "%temp%"

move /Y "%temp%" "%file%"

pause > nul && pause > nul
goto :EOF

:getRandomValue value="list"
set /A "rand=!random:~-1!+1"
for /F "tokens=%rand%" %%v in (%2) do set "%1=%%v"

任何帮助将不胜感激。

编辑: list.txt 包含一个列表,如钢笔纸橡胶等,旁边有相应的值。

pen=5
pencil=43
paper=0
rubber=22

bat 文件所做的只是将随机数从提供的数字行中提取出来。在以下情况下,它会将 pen 的值更改为从 1 到 10 的随机数。但如果我添加一些超过 10 的额外数字,它将忽略它们。

【问题讨论】:

  • 我真的不知道你的代码是用来做什么的,这对我来说毫无意义。如果您edit您的问题并尝试解释它可能会有所帮助。如果您在这样做时还提供一些D:\list.txt 的示例内容,将不胜感激。
  • set /A "rand=!random:~-1!+1"110 之间选择一个数字,如果您想在120 之间选择一个随机数,请更改该行。当然,您发布所有这些内容并不是为了要求我们提供代码以在一个范围内选择一个随机整数!我敢打赌,搜索工具可以很容易地找到这样的例子。

标签: for-loop batch-file random cmd


【解决方案1】:

您忘记指定此问题的origin post。在这样的文章中,没有任何关于如何给出概率的规范,但是提供的所有 3 个示例都有 10 个可能值,所以我假设 所有 概率有 10 个值。解决方法是添加每个值可以具有的概率数:

@echo off
setlocal EnableDelayedExpansion

rem Define the probabilities for new values
set "value[apple]=0 0 0 0 0 0 0 1 1 1" & set "num[apple]=10" & rem 0 (70%) or 1 (30%)
set "value[peach]=0 0 0 0 0 1 2 3 4 5" & set "num[peach]=10" & rem from 0 (50%) to 5 (the rest 50%)
set "value[banana]=54 68 82 96" & set "num[banana]=4" & rem each 25%

rem Randomize
for /L %%i in (1,10,1%time:~-2%) do set "ran=!random!"

(for /F "tokens=1,2 delims==" %%a in (input.ini) do (
   if defined value[%%a] (
      call :getRandomValue value=%%a
      echo %%a=!value!
   ) else if "%%b" neq "" (
      echo %%a=%%b
   ) else (
      echo %%a
   )
)) > output.ini

move /Y output.ini input.ini
goto :EOF


:getRandomValue value=item
set /A "ran=%random%%%num[%2]+1"
for /F "tokens=%ran%" %%v in ("!value[%2]!") do set "%1=%%v"
exit /B

您也(再次)忘记提供输入文件的真实格式,包括[headers]

[Berries]
Strawberry=1
Blackberry=-13
Blueberry=100
Cherry=6
[Fruits]
apple=0
peach=4
banana=18
orange=-2.5
[Vegetables]
Potato=44
Tomato=2
Onion=0
Garlic=17

EDIT 2022/01/08: 根据评论中的要求添加了新方法

正如我已经说过的,您没有指定了定义可能值的规则。我根据您的第一个示例提出了一种可以正常工作的方法,但是您定义了 not 符合我提出的方法的值(10 个可能的值,就像在您的第一个示例中一样)。我修改了方法,然后你发明的值也不符合:“为什么是 100 个值?” “因为任何超过 31 的数字都会使方法失败。 ..”

我(再次)修改了方法,因此您可以通过值:百分比对来定义概率。这里是:

@echo off
setlocal EnableDelayedExpansion

rem Define the probabilities for new values as value:percent pairs
set "value[apple]=23:17 68:83"                    & rem 23 at 17%, 68 at 83%
set "value[peach]=0:50 1:10 2:10 3:10 4:10 5:10"  & rem from 0 (50%) to 5 (the rest 50%)
set "value[banana]=54:25 68:25 82:25 96:25"       & rem each 25%

rem Randomize
for /L %%i in (1,10,1%time:~-2%) do set "ran=!random!"

(for /F "tokens=1,2 delims==" %%a in (input.ini) do (
   if defined value[%%a] (
      call :getRandomValue %%a
      echo %%a=!value!
   ) else if "%%b" neq "" (
      echo %%a=%%b
   ) else (
      echo %%a
   )
)) > output.ini

move /Y output.ini input.ini
goto :EOF


:getRandomValue item
set /A "ran=%random%%%100+1, val=0"
for %%a in (!value[%1]!) do for /F "tokens=1,2 delims=:" %%x in ("%%a") do (
   if %ran% gtr !val! set "value=%%x"
   set /A val+=%%y
)
exit /B

【讨论】:

  • 如果你输入 num[apple]=100 并提供一百个可能的数字,它不会起作用。为什么是100?显然是为了处理您提供的系统内的百分比。例如,没有其他方法可以为 apple=23 设置 17% 的概率,为 apple=68 设置 83% 的概率。所以会有 100 个数字:23 中的 17 个和 68 中的 83 个。
  • 您能帮我将可能值的数量增加到 100 个吗?
  • 查看我上次的编辑...
【解决方案2】:

您的目标是从列表中随机索引,这需要您首先确定列表中的项目数。

这样做的一种方法:

@Echo off

 Set "var[pen]=a b c d e f g h i"

Rem enable enviroment for !expanison!
 Setlocal EnableDelayedExpansion

Rem Build 'array', splitting string on spaces and incrementing array size count
 Set _i=1& Set "item[1]=%var[pen]: =" & Set /A "_i+=1" & Set "item[!_i!]=%"

Rem index randomly from known array size [one indexed]
 For /f delims^= %%i in ('Set /A !random! %%!_i! + 1')Do Echo(Item:%%i = !Item[%%i]!
 Pause

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多