2013-12-23 3 views
0

Как часть программы, которую я делаю, я хочу, чтобы иметь возможность «строить» или «отмечать» случайные точки на сетке. При этом мне нужно создать случайное число (x), чтобы определить количество графиков, а затем x количество различных случайных чисел, представляющих координаты. На данный момент у меня есть следующий код:Пакетное генерирование случайного числа случайных чисел

@echo off 
:obno 
set /a r1=%random% 
if %r1% gtr 10 goto obno else (
goto ob 
) 

:ob 
for /L %%R in (1,1,%r1%) do set /a n%%R=%random%*240/32678+1 
echo %r1% 
echo %n1% %n2% %n3% %n4% %n5% %n6% %n7% %n8% %n9% %n10% 
pause 

Что здесь происходит, я в конечном итоге с х количеством того же случайного числа вместо различных единиц

т.е. Ouput:

5 
108 108 108 108 108 

так любая помощь будет принята с благодарностью!

+0

Что вы думаете, что не так? –

ответ

1

В цикле вы следует использовать задержанное расширение, например

SETLOCAL ENABLEDELAYEDEXPANSION and using !RANDOM! instead of %RANDOM% 

И ...

%RANDOM% gives you a random number between 0 and 32767. 

Используя выражение, как показано ниже вы можете изменить диапазон, что вам нравится (здесь диапазон [1 ... 100] вместо [0 ... 32767]) ,

SET /A test=%RANDOM% * 100/32768 + 1 

И ниже будет производить число от 1 ~ 100

set /a num=%random% %%100 +1 

Чтобы получить случайное число в диапазоне от 0 до 9 в командной строке, используйте

set /a "rand=%random% % 10" 

Если используется в пакете затем удвоить оператор модуля

set /a "rand=%random% %% 10" 
+0

ah Я пробовал использовать setlocal 'enabledelayedexpansion' без использования! – user3130353

+0

Если ваша проблема решена ... вы можете выбрать это как правильный ответ! – Sunny

0
@ECHO OFF 
SETLOCAL 
:obno 
set /a r1=%RANDOM% %% 10 + 1 

:ob 
for /L %%R in (1,1,%r1%) do CALL set /a n%%R=%%random%% %%%% 240 + 1 
echo %r1% 
echo %n1% %n2% %n3% %n4% %n5% %n6% %n7% %n8% %n9% %n10% 
GOTO :EOF 

С% случайным% производит случайное число 0..32767, исходный код будет тратить много времени на ожидание числа от 0 до 10. Кроме того, он может генерировать 0.

Оператор % является используется для «модуля». В партии, вы должны удвоить его, так %random% %% 10 производит 0..9

По CALL ИНГАМ команды, вы можете избежать необходимости setlocal enabledelayedexpansion но вы также должны удвоить любой % вы используете, поэтому удвоение вокруг random и четыре раза для оператора мод.

setlocal не строго необходимо, но что она делает обратно изменения Enviroment когда партия заканчивается, так Г1, n1..n10 просто больше не существует в среде раз шихтовых отделки.Если у вас OMITsetlocal, то любая переменная, установленная за один проход, будет REMAIN, установленный для последующего запуска, поэтому, если ваш первый запуск устанавливает n5 (а также поэтому n1..n4), то, если второй запуск устанавливает r1 = 2, n3..n5 будет отображаться с устаревшими данными предыдущего прогона.

Наконец, если вы позволите r1 = 0, то, так как ни один из n1..n10 не установлены, команда echo %n1%... будет решена в echo, будет покажет echo статус (Echo вкл/выкл). Это можно преодолеть, используя синтаксис echo(%n1%.... Было обнаружено, что персонаж, следующий за O, выполняет некоторые странные вещи.
echo Dot, например, является традиционным для строки новой строки. ( может показаться странным и, похоже, «разбалансировать» вложенность, но работает довольно успешно, чтобы создать новую строку с пустыми аргументами.

1

Используя код, вы можете использовать call и двойной % сделать %%random%%

@echo off 
:obno 
set /a r1=%random% 
if %r1% gtr 10 goto obno else (
goto ob 
) 

:ob 
for /L %%R in (1,1,%r1%) do call set /a n%%R=%%random%%*240/32678+1 
echo %r1% 
echo %n1% %n2% %n3% %n4% %n5% %n6% %n7% %n8% %n9% %n10% 
pause 
Смежные вопросы