增加随机抽取的号码数量
Increase amount of numbers for picking randomly
有一个批处理文件在 list.txt 中查找 Pen=n 并从给定的十个数字行中随机更改其值 (n)(设置“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 的额外数字,它就会忽略它们。
您的目标是从列表中随机索引,这需要您首先确定列表中的项目数。
这样做的一种方法:
@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
您忘记指定此问题的origin post。在这样的 post 中,没有关于必须如何给出概率的任何规范,但是提供的所有 3 个示例都有 10 个可能值,所以我假设 all 概率有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
编辑 2022/01/08: 根据评论中的要求添加了新方法
正如我已经说过的,您没有指定规则来定义可能值。我根据你的第一个例子提出了一个正确工作的方法,但是你定义的值 not 符合我提出的方法(10 个可能的值,就像你的第一个例子)。我修改了方法,然后你发明了不符合的值:“为什么是 100 个值?” “因为任何数字超过 31 将使方法失败..."
我(再次)修改了方法,因此您可以通过 value:percent 对定义概率。这是:
@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
有一个批处理文件在 list.txt 中查找 Pen=n 并从给定的十个数字行中随机更改其值 (n)(设置“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 的额外数字,它就会忽略它们。
您的目标是从列表中随机索引,这需要您首先确定列表中的项目数。
这样做的一种方法:
@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
您忘记指定此问题的origin post。在这样的 post 中,没有关于必须如何给出概率的任何规范,但是提供的所有 3 个示例都有 10 个可能值,所以我假设 all 概率有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
编辑 2022/01/08: 根据评论中的要求添加了新方法
正如我已经说过的,您没有指定规则来定义可能值。我根据你的第一个例子提出了一个正确工作的方法,但是你定义的值 not 符合我提出的方法(10 个可能的值,就像你的第一个例子)。我修改了方法,然后你发明了不符合的值:“为什么是 100 个值?” “因为任何数字超过 31 将使方法失败..."
我(再次)修改了方法,因此您可以通过 value:percent 对定义概率。这是:
@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