<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: генерация случайного числа из диапазона значений]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=3372&amp;type=atom" />
	<updated>2009-07-05T02:35:09Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=3372</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: генерация случайного числа из диапазона значений]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=25716#p25716" />
			<content type="html"><![CDATA[<p>Случайные числа можно использовать и в качестве указателей на элементы (от 1 до N) заранее определенного списка, как это делается в команде for /f. Следующий пример иллюстрирует генерирование 26-значного шестнадцатеричного кода, который может пригодиться при 128-разрядном шифровании WEP в беспроводных локальных сетях:</p><div class="codebox"><pre><code>@echo off
set I=26
set N=16
set CHAR=0 1 2 3 4 5 6 7 8 9 A B C D E F
:LOOP
set /a R=1+%N%*%random%/32768
for /f &quot;tokens=%R%&quot; %%q in (&quot;%CHAR%&quot;) do (set Hex=%%q%Hex%)
Set /a I-=1
If %I% GTR 0 goto LOOP
echo %Hex%</code></pre></div><p>Переменная <strong>I</strong> определяет длину выдаваемого кода, а значение переменной <strong>N</strong> должно совпадать с количеством элементов списка CHAR. В принципе представленной программой можно воспользоваться для генерирования случайных паролей. Однако, как видно из параметров цикла <strong>for /f</strong>, количество элементов списка ограничено числом 31, этого достаточно для стандартного алфавита, но никакой гибкости применения практически не обеспечивает.</p><p>=================================================================================================</p><p>Больше возможностей предлагает операция над переменными а-ля set <strong>VAR=%VAR:~10,5%</strong>, при помощи которой из заданной переменной можно извлечь некоторую подстроку в соответствии с величиной смещения («10») и длиной («5»). Указанное смещение возможно задать и случайным образом. Ниже приведен пример, показывающий, как в символьном массиве (CHAR) определяются доступные для генерирования пароля (PW) символы, и выдается случайный пароль длиной в восемь символов:</p><div class="codebox"><pre><code>@echo off
set I=8
set N=65
set CHAR=0123456789$#_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWQYZ
:LOOP
set /a R=%N%*%random%/32768
set PW=!CHAR:~%R%,1!%PW%
set /a I-=1
if %I% GTR 0 goto LOOP
echo %PW%</code></pre></div>]]></content>
			<author>
				<name><![CDATA[kiber_punk]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=23894</uri>
			</author>
			<updated>2009-07-05T02:35:09Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=25716#p25716</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: генерация случайного числа из диапазона значений]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=25715#p25715" />
			<content type="html"><![CDATA[<p>Бывают случаи когда необходимо сгенерировать случайное число из определённого диапазона.<br />Переменная <strong>%random%</strong> раскрывается в случайное десятичное число от 0 до 32767. На первый взгляд получить от неё что-то полезное не представляется возможным.<br />Но если задействовать арифметические возможности команды <strong>set</strong>, то можно получить желаемый результат.<br />Например, нам необходимо сгенерировать случайное число от 0 до 5:<br /></p><div class="codebox"><pre><code>set /a 1+5*%random%/32768</code></pre></div><p>простой пример &quot;Русской рулетки&quot;:<br /></p><div class="codebox"><pre><code>@echo off
set /a RND=2*%random%/32767&gt;NUL
if %RND%==0 (echo Нет)
if %RND%==1 (echo Да)</code></pre></div><p>Для генерации числа из определённого диапазона, следует воспользоваться следующей конструкцией:<br /></p><div class="quotebox"><blockquote><div class="codebox"><pre><code>SET /A R=MIN+(MAX-MIN+1)*%random%/32768</code></pre></div><p><strong>MIN</strong> - минимальное значение<br /><strong>MAX</strong> - максимальное значение</p></blockquote></div><p>Переменная R принимает случайное значение. Переменные MIN и MAX определяют при этом нижнюю и верхнюю границу желаемого числового диапазона (MIN&lt;R&lt;MAX), причем значения могут быть и отрицательными. Выражение <strong>(MAX-MIN+1)</strong> представляет собой количество элементов в сгенерированном таким образом числовом промежутке.</p><br /><br /><p><span class="bbu">П</span>ример генератора случайных чисел от -50 до 50: <br /></p><div class="codebox"><pre><code>set MIN=-50
set MAX=50
set /a R=MIN+(MAX-MIN+1) * %random%/32768
echo Random number from range -50..50 : %R%</code></pre></div><p>========================================================================</p><p>Вынесем генератор в отдельную функцию:<br /></p><div class="codebox"><pre><code>:RND
set MIN=%1
set MAX=%2
SET /A %3=%MIN%+(%MAX%-%MIN%+1)*%random%/32768</code></pre></div><p>Тогда обращение к функции в скрипте будет выглядеть, примерно, так:<br /></p><div class="quotebox"><blockquote><p>call :RND -10 10 n</p></blockquote></div><p><strong>-10</strong> - минимальное значение,<br />&nbsp; <strong>10</strong> - максимальное значение,<br />&nbsp; <strong>n</strong> - возвращаемая переменная содержащая случайное число.</p><p>Итак, многообразному применению случайных чисел в командных файлах больше ничто не препятствует. Среди возможных применений - управление итерациями, ветвление для перехода на заданные ветви или файлы, а также параметризация вызовов программ.</p>]]></content>
			<author>
				<name><![CDATA[kiber_punk]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=23894</uri>
			</author>
			<updated>2009-07-05T02:23:43Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=25715#p25715</id>
		</entry>
</feed>
