Войти

Показать полную графическую версию : Выбрать случайные символы.


neth1
30-03-2017, 21:24
Среда win xp.
Задано несколько символов.
Допустим '1,5,8,3,s,h,n'
Нужно случайным образом выбрать три из них.
Повторения допускаются.

Iska
30-03-2017, 22:10
@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.

neth1
31-03-2017, 06:04
Похоже под xp не работает:
"Application Data"call :GetRandom
""Application Data"call" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Iska
31-03-2017, 06:54
Откуда там «"Application Data"»? Проверьте, правильно ли Вы скопировали код.

megaloman
31-03-2017, 15:44
@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
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

neth1
01-04-2017, 17:25
Уверены, что это должно работать на голой 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
Уверены, что это должно работать на голой xp sp3?Да хоть на одетой, ибо в ней сие и писалось. И потом:
Допустим '1,5,8,3,s,h,n'
Нужно случайным образом выбрать три из них.
Повторения допускаются.
Если Вы не обратили внимание, то:
...
C:\Documents and Settings\name>echo:1nh
1nh
...
Это и есть три рандомных символа из Вашего же условия задачи. Или Вам как-то нужно эти символы особым образом сохранять, скажем, в массив?

megaloman
01-04-2017, 18:11
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%%"
)

Iska
01-04-2017, 18:53
neth1, может быть Вы озвучите Вашу глобальную цель — зачем это надо?

greg zakharov
01-04-2017, 19:08
при изменении длины набора символов и длины случайного слова придётся перелопатить весь кодЧего?!
И, наконец, в Вашем коде имхо логичнее применить ForВот не надо этих "имхо", ибо в данном случае random в for ведет себя совсем не так как ожидается в loop ввиду возможно я неправ
Почему? Попробую отписаться, как освободится время.

neth1
01-04-2017, 21:28
Разобрался, спасибо.




© OSzone.net 2001-2012