Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Выбрать случайные символы. (http://forum.oszone.net/showthread.php?t=325366)

neth1 30-03-2017 21:24 2724502

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

Iska 30-03-2017 22:10 2724512

Скрытый текст
Код:

@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 2724566

Похоже под xp не работает:
Код:

"Application Data"call :GetRandom
""Application Data"call" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.


Iska 31-03-2017 06:54 2724571

Откуда там «"Application Data"»? Проверьте, правильно ли Вы скопировали код.

megaloman 31-03-2017 15:44 2724697

Чистый 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


neth1 01-04-2017 17:25 2724951

Уверены, что это должно работать на голой 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
...

Это и есть три рандомных символа из Вашего же условия задачи. Или Вам как-то нужно эти символы особым образом сохранять, скажем, в массив?

megaloman 01-04-2017 18:11 2724967

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 2724979

neth1, может быть Вы озвучите Вашу глобальную цель — зачем это надо?

greg zakharov 01-04-2017 19:08 2724987

Цитата:

Цитата megaloman
при изменении длины набора символов и длины случайного слова придётся перелопатить весь код

Чего?!
Цитата:

Цитата megaloman
И, наконец, в Вашем коде имхо логичнее применить For

Вот не надо этих "имхо", ибо в данном случае random в for ведет себя совсем не так как ожидается в loop ввиду
Цитата:

Цитата megaloman
возможно я неправ

Почему? Попробую отписаться, как освободится время.

neth1 01-04-2017 21:28 2725027

Разобрался, спасибо.


Время: 18:21.

Время: 18:21.
© OSzone.net 2001-