Выбрать случайные символы.
Среда win xp.
Задано несколько символов.
Допустим '1,5,8,3,s,h,n'
Нужно случайным образом выбрать три из них.
Повторения допускаются.
|
Скрытый текст
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
set sValues=1,5,8,3,s,h,n
for /l %%i in (1, 1, 20) do (
call :GetRandom
call :GetValue !Random! %sValues%
echo [!Value!]
)
endlocal
exit /b 0
:GetRandom
setlocal enableextensions enabledelayedexpansion
set sOut=%~0
for /f "usebackq delims=" %%i in (
`mshta.exe "javascript:new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Math.floor(Math.random() * 7).toString());close();" 1 ^| more`
) do (
set /a iRandom = %%i
)
endlocal & set %sOut:~4%=%iRandom%
exit /b
:GetValue
setlocal enableextensions enabledelayedexpansion
set sOut=%~0
set /a iCount = %~1
for /l %%i in (1, 1, %iCount%) do shift /2
set sValue=%~2
endlocal & set %sOut:~4%=%sValue%
exit /b
Для демонстрации выбирается двадцать значений, замените на потребное Вам «3». Псевдослучайное значение генерируется JScript-кодом посредством mshta.exe.
|
Похоже под xp не работает:
Код:
"Application Data"call :GetRandom
""Application Data"call" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
|
Откуда там «"Application Data"»? Проверьте, правильно ли Вы скопировали код.
|
Чистый CMD
Код:
@Echo Off
cls
Set "Symb=abcdefghijklmno"
Set /A "NOut=3"
SetLocal EnableExtensions EnableDelayedExpansion
Set /A NSymb=-1
FOR /L %%i IN (0,1,20) DO (
Call Set "ii=%%Symb:~%%i,1%%"
If Not "!ii!"=="" Set NSymb=%%i
)
Set /A NSymb+=1
:Begin
Set "SOut="
FOR /L %%j IN (1,1,%NOut%) DO (
FOR /L %%i IN (1,1,100) DO Set /a rnd=!random!
Set "rnd=000!rnd!"
Set /A rnd=1!rnd:~-3!-1000
Set /A rnd=%NSymb%*!rnd!/999
Call Set "rnd=%%Symb:~!rnd!,1%%"
Set "Sout=!Sout!!rnd!"
)
Echo %Sout%
pause >nul
GoTo :Begin
|
greg zakharov |
01-04-2017 16:56 2724945 |
megaloman, Вы явно усложняете:
Код:
@echo off
setlocal enabledelayedexpansion
set "map=1583shn"
set "i=0"
:loop
set /a "i+=1", "j=7*%random%/32767"
set "r=!r!!map:~%j%,1!"
if !i! neq 3 goto:loop
echo:%r%
endlocal
exit /b
|
Уверены, что это должно работать на голой xp sp3?
У меня не завелись оба варианта.
Код:
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\name>C:\1.bat
C:\Documents and Settings\name>setlocal enabledelayedexpansion
C:\Documents and Settings\name>set "map=1583shn"
C:\Documents and Settings\name>set "i=0"
C:\Documents and Settings\name>set /a "i+=1", "j=7*1144/32767"
C:\Documents and Settings\name>set "r=!r!!map:~0,1!"
C:\Documents and Settings\name>if !i! NEQ 3 goto:loop
C:\Documents and Settings\name>set /a "i+=1", "j=7*32076/32767"
C:\Documents and Settings\name>set "r=!r!!map:~6,1!"
C:\Documents and Settings\name>if !i! NEQ 3 goto:loop
C:\Documents and Settings\name>set /a "i+=1", "j=7*26214/32767"
C:\Documents and Settings\name>set "r=!r!!map:~5,1!"
C:\Documents and Settings\name>if !i! NEQ 3 goto:loop
C:\Documents and Settings\name>echo:1nh
1nh
C:\Documents and Settings\name>endlocal
Вариант от megaloman выводит много раз "Set /a rnd=!random!" прежде чем вывести 3 рандомных символа дважды 'Echo gie
gie'.
|
greg zakharov |
01-04-2017 17:38 2724957 |
Цитата:
Цитата neth1
Уверены, что это должно работать на голой xp sp3?
|
Да хоть на одетой, ибо в ней сие и писалось. И потом:
Цитата:
Цитата neth1
Допустим '1,5,8,3,s,h,n'
Нужно случайным образом выбрать три из них.
Повторения допускаются.
|
Если Вы не обратили внимание, то:
Цитата:
Цитата neth1
...
C:\Documents and Settings\name>echo:1nh
1nh
...
|
Это и есть три рандомных символа из Вашего же условия задачи. Или Вам как-то нужно эти символы особым образом сохранять, скажем, в массив?
|
neth1, А в начале кода у Вас присутствует @Echo off? Иначе объяснить отображение команд на экране невозможно.
greg zakharov, Возможно, Вы частично правы, но я стремлюсь делать более обобщенные скрипты, у Вас же при изменении длины набора символов и длины случайного слова придётся перелопатить весь код. Мне показалось, что вариант с однократным для каждого символа определением *%random%/32767 часто даёт серию близких значений, возможно я неправ. И, наконец, в Вашем коде имхо логичнее применить For
Код:
FOR /L %%i IN (1,1,3) DO (
Set /A j=7*!random!/32767
call set "r=!r!%%map:~!j!,1%%"
)
|
neth1, может быть Вы озвучите Вашу глобальную цель — зачем это надо?
|
greg zakharov |
01-04-2017 19:08 2724987 |
Цитата:
Цитата megaloman
при изменении длины набора символов и длины случайного слова придётся перелопатить весь код
|
Чего?!
Цитата:
Цитата megaloman
И, наконец, в Вашем коде имхо логичнее применить For
|
Вот не надо этих "имхо", ибо в данном случае random в for ведет себя совсем не так как ожидается в loop ввиду
Цитата:
Цитата megaloman
возможно я неправ
|
Почему? Попробую отписаться, как освободится время.
|
Время: 18:21.
© OSzone.net 2001-