Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Генератор случайных чисел пропускает некоторые значения

Ответить
Настройки темы
CMD/BAT - [решено] Генератор случайных чисел пропускает некоторые значения

Новый участник


Сообщения: 46
Благодарности: 2

Профиль | Отправить PM | Цитировать


Здравствуйте.

В коде:
Код: Выделить весь код
@echo off
set CHAR=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
:1
set N=37
set /a R=%random%/32768+%N%*%random%/32768+1
for /f "tokens=%R%" %%q in ("%CHAR%") do (set C=%%q)
set N=%C%
echo:%N%
if %N%==37 pause
if %N%==36 pause
if %N%==35 pause
if %N%==34 pause
if %N%==33 pause
if %N%==32 pause
goto 1
Пауза не сработает, потому что номера с 32 по 37 не выпадают.

Если записать так:
Код: Выделить весь код
@echo off
set CHAR=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
:1
set N=37
set /a R=%random%/32768+%N%*%random%/32768+1
for /f "tokens=%R%" %%q in ("%CHAR%") do (set N=%%q)
echo:%N%
if %N%==37 pause
if %N%==36 pause
if %N%==35 pause
if %N%==34 pause
if %N%==32 pause
goto 1
Начинает выпадать 37. При этом номера с 32 по 36 не выпадают всё равно.
Что тут не так?

P.S. Это только модуль большой программы. И да, сам по себе он выглядит бессмысленно.

Отправлено: 15:27, 04-03-2018

 

Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


subuday77,
Вот статистика распределения значений при работе %random%. Как видно, %random% работает
Код: Выделить весь код
@Echo Off
cls
Set /A MIN=1
Set /A Max=37

Set /A i=0
:Begin
	Set /A R=%MIN%+(%MAX%-%MIN%+1) * %random%/32768
	Set /A R%R%+=1

	Set /A i+=1
If Not %i% EQU 5000 GoTo :Begin

FOR /L %%i IN (%MIN%,1,%MAX%) DO Call :Out %%i

pause
GoTo :Eof

:Out
	Call Set RR=%%R%1%%
	Echo R%1 %RR%
GoTo :Eof
похоже, ограничение кроется в использовании tokens
Код: Выделить весь код
@Echo Off
cls
Set /A MIN=1
Set /A Max=37

Set "CHAR=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37"

:Begin
	Set "N=not defined"
	Set /A R=%MIN%+(%MAX%-%MIN%+1) * %random%/32768
	For /f "tokens=%R%" %%q in ("%CHAR%") Do Set "N=%%q"
Echo R=%R% N=%N%	
	If %R%==32 Echo R=%R% N=%N% &pause
	If %R%==33 Echo R=%R% N=%N% &pause
	If %R%==34 Echo R=%R% N=%N% &pause
	If %R%==35 Echo R=%R% N=%N% &pause
	If %R%==36 Echo R=%R% N=%N% &pause
	If %R%==37 Echo R=%R% N=%N% &pause
GoTo :Begin
Вот рабочий вариант выбора подстроки
Код: Выделить весь код
@Echo Off
cls
Set /A MIN=1
Set /A Max=37

Set "CHAR=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37"

:Begin
	Set /A R=%MIN%+(%MAX%-%MIN%+1) * %random%/32768
	Call :Substr "N" %R% %CHAR%

	If %N%==32 Echo %N% &pause
	If %N%==33 Echo %N% &pause
	If %N%==34 Echo %N% &pause
	If %N%==35 Echo %N% &pause
	If %N%==36 Echo %N% &pause
	If %N%==37 Echo %N% &pause
GoTo :Begin

:Substr
	FOR /L %%i IN (2,1,%2) DO Shift /3
	Set "%~1=%3"
GoTo :Eof

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 04-03-2018 в 18:02.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:32, 04-03-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 46
Благодарности: 2

Профиль | Отправить PM | Цитировать


Спасибо!
Я решил ещё проще, если не использовать for и прочую приблуду типа токенов, то и CHAR не нужен:
Код: Выделить весь код
@echo off
:1
SET /A N=1+(37-1+1)*%random%/32768
echo:%N%
if %N%==37 pause
if %N%==36 pause
if %N%==35 pause
if %N%==34 pause
if %N%==33 pause
if %N%==32 pause
goto 1
Собственно, всё.

Но у меня вопрос.
Цитата megaloman:
FOR /L %%i IN (2,1,%2) DO Shift /3 Set "%~1=%3" »
Как это работает? Можно чуть подробнее?

Отправлено: 18:04, 04-03-2018 | #3


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


subuday77, Я и в угаре воскресного дня не мог предположить, что CHAR=1 2 3 4 5 6 7 8 9 10 11 12 13 .... это реальные подстроки, я предполагал, что-то похожее на CHAR=tralala kuku ogogo ..., а цифры перечислены для простоты.
Читайте Shift /?
Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла.

SHIFT [/n]

Команда SHIFT при включении расширенной обработки команд поддерживает ключ
/n, задающий начало сдвига параметров с номера n, где n может быть от 0 до 9.
Например, в следующей команде:

SHIFT /2

%3 заменяется на %2, %4 на %3 и т.д., а %0 и %1 остаются без изменений.
У меня организована подпрограмма для выбора подстроки в строке.
Call :Substr "N" %R% %CHAR%
"N" - имя переменной, куда занесу выбранную подстроку
в %R% номер подстроки в строке %CHAR%. По Вашей постановке внутри подстроки нет пробелов, подстроки разделяются пробелами. Давайте для определенности возьмем:
Call :Substr "N" 5 1 2 3 4 5 6 7 8 9 10 11 12 13 ....
То есть в подпрограмме %1 это "N", %2 это 5 (то есть номер выбираемой подстроки)
Я хочу, чтобы на месте %3 была нужная подстрока
Поэтому, начиная с 3 места я в цикле сдвигаю аргументы нужное число раз посредством Shift
А затем присваиваю переменной (в данном случае после применения %~1 это N) значение аргумента, который сейчас на 3 месте.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 04-03-2018 в 18:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:27, 04-03-2018 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Генератор случайных чисел пропускает некоторые значения

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Генератор номеров телефонов или случайных чисел DJIOAN Скриптовые языки администрирования Windows 21 24-06-2016 18:09
Разное - Генератор псевдослучайных чисел Bordermax Хочу все знать 1 21-06-2011 09:53
CMD/BAT - [решено] Поиск строки в файле и замена её на набор из случайных чисел и букв Sub-Zero Скриптовые языки администрирования Windows 6 08-02-2011 18:54
C/C++ - Как правильно задать диапазон генерации случайных чисел perfomanse Программирование и базы данных 6 03-07-2010 22:10
Генератор случайных чисел Murrey Хочу все знать 3 22-08-2006 13:00




 
Переход