elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Ayuda](Batch) 10 Numeros random del 1 al 10
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda](Batch) 10 Numeros random del 1 al 10  (Leído 7,270 veces)
JoakoDS

Desconectado Desconectado

Mensajes: 2


Ver Perfil
[Ayuda](Batch) 10 Numeros random del 1 al 10
« en: 17 Julio 2014, 11:18 am »

Hola; Soy nuevo en el foro, y me uní para hacer una consulta.

Resulta que estoy en un proyecto donde estoy estudiando, y estamos haciendo un programita en bat, el programa consta de Preguntas, que el usuario(jugador) deberá responder, parte de la consigna menciona que las preguntas deberan realizarse con un orden aleatorio cada vez que se juegue una partida, por lo tanto, no pueden salir 2       veces en el mismo orden, algo asi  Partida1) ={10  6  5  4   3  1  2  9  7  8} Partida2) ={1  3  10  5  7  4  6  2  9  8}. Cada numero vendria a ser una pregunta distinta.

El problema es que no consigo encontrar la manera de generar un batch que genere cada vez que se inicia, 10 numeros distintos en un rango de 0-9.

Espero que me puedan ayudar, gracias.


« Última modificación: 17 Julio 2014, 12:48 pm por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [Ayuda](Batch) 10 Numeros random del 1 al 10
« Respuesta #1 en: 17 Julio 2014, 16:08 pm »

¿Tiene que ser puro Batch, o se permite la utilización de un script-Batch hibrido que genere un código VBS?

Sincéramente, en mi opinión, deberías ir al profesor y decirle que has preferido evitar el uso de una herramienta simplista como Batch para generar la lógica del algoritmo de aletoriedad, ya que Batch es ineficiente y carece de lógica en ese aspecto, y aparte de quedar como un "Pro", estarías haciendo lo mejor, aunque yo directamente te diría que lo hicieras en Python, Ruby, u otros xD pero entiendo que eso ya es pedir demasiado (porque la clase es de Batch).

Digo esto porque la lógica aleatoria de Batch no permite seleccionar una serie de números distintos dentro de un rango, y que el número elegido sea distinto cada vez, mucho menos permite la utilización de Arrays, así que lo más propable es que el mismo numero aleatorio se repita varias veces y debas corregirlo, es decir, seguir obteniendo otro dígito aleatorio hasta que sea distinto al dígito anterior, y esto, medido en tiempo de ejecución puede tardar bastante para conseguir un 0, y luego un 1, dígitos distintos y que no se repitan entre si.

No merece la pena realizar esa cutrez en Batch, pero si quieres hacerlo, puedes utilizar la variable dinámica %Random%, y hacerle un Substring al String resultante para quedarte con un valor que tenga una longitud de un dígito, y luego hacer las comparaciones necesarias (¿es un 0?, ¿es un 1?, etc),
también se podría hacer de otra forma relacionada, que sería simulando un Array como parámetro de un For ("1 2 3 4 5 6 7 8 9 0"), o como parámetro de un For /L (0, 1, 9), y desordenar las posiciones de los elementos recurriendo a los resultados de la variable %Random%, sea como sea cualquiera de esas técnicas es una completa cutrez.

Te muestro un ejemplo en VBS (el cual puedes llamar/usar desde Batch), VBS tampoco ofrece demasiada libertad, no es un lenguaje muy potente ni muy eficiente pero sin duda es mucho más liviano de lo que sería en Batch.

Código
  1. Randomize
  2.  
  3. ' El máximo número de combinaciones posibles con un rango de '0-9' y sin repetición son '3.628.800',
  4. ' Fuente: www.mathsisfun.com/combinatorics/combinations-permutations-calculator.html
  5. '
  6. ' Pero ese colosal valor disminuiría el rendimiento del código,
  7. ' y no creo que un jugador pueda llegar a hacer más de '1.000' partidas por sesión.
  8. Dim Combos(1000)
  9.  
  10. ' Un Array con los valores que permutar.
  11. Values = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
  12.  
  13. ' Gerero y asigno la primera combinación aleatoria.
  14. Combos(0) = RandomizeArray(Values)
  15.  
  16. ' Genero el resto de combos.
  17. DoCombos()
  18. ' Escribir los combos en un archivo de texto
  19. ' O enviarlos a la salida de la consola para procesarlos con un For en Batch.
  20. ' Como se prefiera.
  21. WScript.Echo("Fin")
  22.  
  23. Sub DoCombos()
  24.  
  25. ' Recorro los espacios vaciós del Array para llenarlos.
  26. For X = 0 To (UBound(Combos) - 1)
  27.  
  28. IsRepeated = False
  29.  
  30.    ' Gerero la siguiente combinación aleatoria.
  31.    Combo = RandomizeArray(Values)
  32.  
  33.    ' Compruebo que la combinación no existe en el Array de combos.
  34.    For Y = 0 To (X)
  35.  
  36.     On Error Resume Next
  37.  
  38.        If Join(Combos(Y), "") = Join(Combo, "") Then
  39.           IsRepeated = True
  40.           Exit For
  41.        End If
  42.  
  43.    Next
  44.  
  45.    ' Añado la combinación al Araay de combinaciones.
  46.    If Not IsRepeated Then
  47.       Combos(X + 1) = Combo
  48.    End If
  49.  
  50. Next
  51.  
  52. End Sub
  53.  
  54. ' Función que desordena los elementos de un array.
  55. Function RandomizeArray(arr)
  56.  
  57.    tmpArray   = arr
  58.    firstIndex = LBound(tmpArray)
  59.    itemCount  = (UBound(tmpArray) - LBound(tmpArray)) + 1
  60.  
  61.    For index = UBound(tmpArray) To (LBound(tmpArray) + 1) Step -1
  62.  
  63.        ' evaluate a random index from LBound to INDEX
  64.        newIndex = (firstIndex + Int(Rnd * itemCount))
  65.  
  66.        ' swap the two items
  67.        tmpValue           = tmpArray(index)
  68.        tmpArray(index)    = tmpArray(newIndex)
  69.        tmpArray(newIndex) = tmpValue
  70.  
  71.        ' prepare for next iteration
  72.        itemCount = itemCount - 1
  73.  
  74.    Next
  75.  
  76.    RandomizeArray = tmpArray
  77.  
  78. End Function


« Última modificación: 17 Julio 2014, 21:12 pm por Eleкtro » En línea



JoakoDS

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: [Ayuda](Batch) 10 Numeros random del 1 al 10
« Respuesta #2 en: 17 Julio 2014, 20:17 pm »

La verdad que me sorprendio la rapidez con la que recibi una respuesta, el sabado voy a preguntarle sobre el uso de VBS, y tambien de NirSoft que lo inclui por una funcion mas.
De todas maneras Eleкtro, aunque logre entender la gran mayoria del codigo, no termino de entender como pasar los 'combos' a un archivo de texto, o mostrarlos en la pantalla; desconozco el tema de los VBS, ahora mismo pienso leer rapidamente el tutorial que esta rondando por acá.
En el caso de que el profesor no lo permita, encontre una manera de que a simple vista no se repitan las preguntas pero no seria completamente aleatorio, no me quiero extender mucho. De todas maneras, quiero adentrarme en los VBS, nunca esta de mas aprender, gracias por la respuesta.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [Ayuda](Batch) 10 Numeros random del 1 al 10
« Respuesta #3 en: 18 Julio 2014, 00:39 am »

La cosa es así, Batch es tan... tan... ¡manco! que un programador deberá recurrir a la utilización de otros lenguajes (porque Batch, cuesta calificarlo como "Lenguaje") para llevar a cabo ciertas tareas, o bien porque Batch no ofrece los medios, o bien porque en otro lenguaje va a resultar más cómodo el desarrollo y el rendimiento resultante será mucho mejor ...que sin duda, lo es.  


De todas maneras Eleкtro, aunque logre entender la gran mayoria del codigo, no termino de entender como pasar los 'combos' a un archivo de texto, o mostrarlos en la pantalla; desconozco el tema de los VBS, ahora mismo pienso leer rapidamente el tutorial que esta rondando por acá.

Añade este método al script de arriba:

Código
  1. Sub WriteTextFile(ArrayCollection, FilePath, Delimiter)
  2.  
  3.    Set ObjTxt = CreateObject("Scripting.FileSystemObject"). _
  4.                 OpenTextFile(FilePath, 2, True)
  5.  
  6.    For Each arr In ArrayCollection
  7.  
  8.        ObjTxt.Writeline(Join(arr, Delimiter))
  9.  
  10.    Next
  11.  
  12.   ObjTxt.Close
  13.  
  14. End Sub

Y luego, antes de finalizar la ejecución del Script, justo después de la instrucción "DoCombos()", añades esto:
Código
  1. WriteTextFile Combos, ".\Combos.txt", ";"

El resultado será un archivo de texto plano con este contenido:

Código:
3;0;5;6;4;9;7;2;8;1
1;7;6;8;5;0;9;2;3;4
3;0;2;4;7;1;8;6;5;9
1;2;5;9;6;8;3;7;4;0
4;2;1;6;5;3;0;8;9;7
0;3;4;6;7;2;8;9;5;1
0;1;4;5;3;9;7;6;2;8
1;3;5;0;2;7;9;4;6;8
4;9;6;0;3;2;7;8;1;5
4;8;6;5;7;9;0;3;1;2
etc...
(No habrá combinaciones repetidas)

PD: El formato del delimitador lo puedes modificar en el parámetro "Delimiter" al llamar al método.



He modificado el método "DoCombos" (ahora lo llamé "FillWithCombos") ya que el control de errores estaba incompleto y provocaba que algunos elementos del Array quedasen vacíos, ya no es necesario un error-handling (otra cosa de la que Batch carece, y VBS en parte también).

Aquí tienes la modificación del código:

Nota: Le añadí el parámetro "AllowDuplicates" al método "FillWithCombos" para hacerlo más liviano, ya que un Array de 100.000 combinacions sin repetición tarda unos pocos segundos en generarse (en Batch eso sería una eternidad, 5-10 min), pero sin repetición tardará muchísimo más ya que tiene que hacer iteraciones al array para comprobar si existe la combinación, esto en un lenguaje como VBS sigue siendo imperfecto, como ya dije tampoco es muy potente, está falto de recursos.
Mi sugerencia, si no te importa que hayan combinaciones duplicadas, puedes hacer las que quieras, será bien rápido, pero si quieres que no hayan duplicados, no sobrepases las 2.000 combinaciones en el Array o irá muy lento.

Código
  1. ' El máximo número de combinaciones posibles con un rango de '0-9' y sin repetición son '3.628.800',
  2. ' Fuente: www.mathsisfun.com/combinatorics/combinations-permutations-calculator.html
  3. '
  4. ' Pero ese colosal valor disminuiría el rendimiento del código,
  5. ' y no creo que un jugador pueda llegar a hacer más de '1.000' partidas por sesión.
  6. Dim Combos(999)
  7.  
  8. ' Un Array con los valores que permutar.
  9. CharSet = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
  10.  
  11. ' Llamo al método principal.
  12. Main()
  13.  
  14. ' El método principal.
  15. Sub Main
  16.  
  17.    On Error Resume Next
  18.  
  19.    ' Lleno el Array con combos.
  20.    Call FillWithCombos(Combos, CharSet, 0, False)
  21.  
  22.    ' Escribo las combinaciones generadas del Array, en un archivo de texto.
  23.    Call WriteTextFile(Combos, ".\Combos.txt", ";")
  24.  
  25.    ' Si hubo algún error...
  26.    If Err.Number <> 0 Then
  27.        ' Envio el código de error a la consola,
  28.        ' el cual puedes procesar checkando la variable dinámica %ERRORLEVEL%.
  29.        WScript.Echo "ExitCode: " & Err.Number & vbNewLine & _
  30.                     "Source: " & Err.Source & vbNewLine & _
  31.                     "Description: " &  Err.Description
  32.        WScript.Quit(Err.Number)
  33.  
  34.    Else ' Si no hubo ningún error...
  35.        ' Envio un código de salida satisfactorio a la consola,
  36.        ' el cual puedes procesar checkando la variable dinámica %ERRORLEVEL%.
  37.        WScript.Quit(0)
  38.  
  39.    End If
  40.  
  41. End Sub
  42.  
  43. ' Función que desordena los elementos de un array.
  44. Randomize
  45. Function RandomizeArray(ByVal arr)
  46.  
  47.   tmpArray   = arr
  48.   firstIndex = LBound(tmpArray)
  49.   itemCount  = (UBound(tmpArray) - LBound(tmpArray)) + 1
  50.  
  51.   For index = UBound(tmpArray) To (LBound(tmpArray) + 1) Step -1
  52.  
  53.       ' evaluate a random index from LBound to INDEX
  54.       newIndex = (firstIndex + Int(Rnd * itemCount))
  55.  
  56.       ' swap the two items
  57.       tmpValue           = tmpArray(index)
  58.       tmpArray(index)    = tmpArray(newIndex)
  59.       tmpArray(newIndex) = tmpValue
  60.  
  61.       ' prepare for next iteration
  62.       itemCount = itemCount - 1
  63.  
  64.   Next
  65.  
  66.   RandomizeArray = tmpArray
  67.  
  68. End Function
  69.  
  70. ' Método que rellena un Array con combinaciones elatorias,
  71. ' sin repetición de combinaciones.
  72. Sub FillWithCombos(Byref Arr, _
  73.                   Byval Values, _
  74.                   Byval StartIndex, _
  75.                   Byval AllowDuplicates)
  76.  
  77.    ' Recorro los elementos del Array para llenarlos.
  78.    For X = StartIndex To (UBound(Arr))
  79.  
  80.       ' Un flag Booleano que determina si una combinación está repetida en el Array.
  81.       IsRepeated = False
  82.  
  83.       ' Gerero la siguiente combinación aleatoria.
  84.       Combo = RandomizeArray(Values)
  85.  
  86.  
  87.       ' Si no está permitido añadir combinaciones duplicadas...
  88.        If Not AllowDuplicates Then
  89.  
  90.           ' Si el primer elemento del Array no está vacio...
  91.           If Not IsEmpty(Arr(0)) Then
  92.  
  93.              ' Determino si ya existe la combinación generada en el Array.
  94.              For Y = 0 To (X - 1)
  95.  
  96.                  If Join(Arr(Y), "") = Join(Combo, "") Then
  97.                     IsRepeated = True
  98.                     Exit For
  99.                  End If
  100.  
  101.              Next 'Y
  102.  
  103.           End If 'IsEmpty(Arr(0))
  104.  
  105.           ' Si la combinación no está repetida...
  106.           If Not IsRepeated Then
  107.              ' Añado la combinación al Array de combinaciones.
  108.              Arr(X) = Combo
  109.  
  110.            ' Si la combinación está repetida...
  111.            Elseif IsRepeated Then
  112.              call FillWithCombos(Combos, Values, X, AllowDuplicates)
  113.  
  114.            End If 'Not IsRepeated
  115.  
  116.        Else ' Si está permitido añadir combinaciones duplicadas...
  117.            ' Añado la combinación al Array de combinaciones.
  118.            Arr(X) = Combo
  119.  
  120.        End If ' Not AllowDuplicates
  121.  
  122.    Next 'X
  123.  
  124. End Sub
  125.  
  126. ' Método que escribe los Arrays de un Array, en un archivo de texto.
  127. Sub WriteTextFile(ByVal ArrayCollection, _
  128.                  ByVal FilePath, _
  129.                  ByVal Delimiter)
  130.  
  131.    Set ObjTxt = CreateObject("Scripting.FileSystemObject"). _
  132.                 OpenTextFile(FilePath, 2, True)
  133.  
  134.    For Each arr In ArrayCollection
  135.        ObjTxt.Writeline(Join(arr, Delimiter))
  136.    Next
  137.  
  138.   ObjTxt.Close
  139.  
  140. End Sub

Como ya te dije esto lo puedes usar desde Batch, solo tienes que escribir el contenido del script VBS dede tu Batch-Script a un archivo externo, y ejecutarlo.

Código
  1. @Echo OFF
  2.  
  3. (
  4.  
  5. Echo Dim Combos^(999^)
  6. Echo CharSet = Array^(0, 1, 2, 3, 4, 5, 6, 7, 8, 9^)
  7. Echo Main()
  8. Echo Sub Main
  9. Echo     Call FillWithCombos^(Combos, CharSet, 0, False^)
  10. Echo     Call WriteTextFile^(Combos, ".\Combos.txt", ";"^)
  11. Echo     WScript.Quit^(0^)
  12. Echo End Sub
  13. Echo etc...
  14. Echo etc...
  15. Echo etc...
  16.  
  17. )>"%TEMP%\Script.vbs"
  18.  
  19. CScript.exe /NoLogo "%TEMP%\Script.vbs"
  20. If %ErrorLevel% EQU 0 (
  21.  Echo Todo OK.
  22.  REM Procesar las combinaciones del archivo de texto resultante...
  23. )

Saludos.
« Última modificación: 18 Julio 2014, 01:00 am por Eleкtro » En línea



Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [Ayuda](Batch) 10 Numeros random del 1 al 10
« Respuesta #4 en: 18 Julio 2014, 03:27 am »

El código anterior de VBS, traducido a Batch podría ser algo como esto:

PD: Pero ya sabes mi opinión, la diferencia de tiempo de ejecución solamente para generar 100-1.000 combinaciones sin repetición en Batch es... ABISMAL (para mal, obvio).

Código:
@Echo Off & (CHCP 1252)>Nul & SetLocal EnableDelayedExpansion 
Title By .:: Elektro ::.

:: El indicador de máximas combinaciones.
Set /A "MaxCombos=10" - 1

:: El indicador de máxima longitud por combinación.
Set /A "MaxComboLen=10" - 1

:: El valor máximo del rango aleatorio (el valor mínimo es estático, un "0").
Set /A "MaxValue=9" + 1

:: El delimitador de valores.
Set "ValueDelimiter=, "

:: La variable donde cachearé cada combinación por separado.
:: Cada valor estará separado por el delimitador específicado (,).
Set "Combo="

:: El archivo donde guardaré las combinaciones generadas.
:: Nota: En principio iba a usar una variable para simular un Array,
::       Pero luego recordé que la capacidad de Batch está limitado a un Int16 (32.767)
::       Y ese sería el limitado número de caracteres que podría almacenar el "Array".
Set "CombosFile=%Temp%\Combos.txt"

:: El índice inicial de dígito de la combinación,
:: para usarlo en el parámetro del "For Range" (/L)
Set /A "StartIndex=0"



:Main
REM Genero los combos en el archivo de Combos.
Call :DoCombos

REM Ejemplo de como ver el archivo de Combos:
Type "%CombosFile%"
Pause&CLS

REM Ejemplo de como procesar cada valor de cada combo:
For /F "Delims= UseBackQ" %%c IN ("%CombosFile%") Do (

Set "Combo=%%c"
Echo Combinacion: !Combo!
For %%v IN (!Combo!) Do (
Echo Valor: %%v
)
Echo+
)

Pause&Exit /B 0



:DoCombos
REM Elimino posibles restos del archivo de Combos.
REM Creo un nuevo archivo de Combos, vacío.
(
 Del /Q "%CombosFile%"
 FSUtil.exe File CreateNew "%CombosFile%" 0
)1>Nul 2>&1

REM Genero los Combos hasta llegar a "X" cantidad de Combos.
For /L %%_ In (
0, 1, %MaxCombos%
) Do (
Call :SetCombo
)
Goto:EOF



:SetCombo
For /L %%x In (
!StartIndex!, 1, %MaxComboLen%
) Do (

REM Le añado un dígito aleatorio a la combinación.
REM El valor del rango inicial de la expresión aritmética es "0".
Set /A "Value=!Random! %%!MaxValue!"

REm Compruebo si el dígito existe en la combinación.
(Echo "!Combo!"|Find.exe "%ValueDelimiter%!Value!")1>Nul && (

REM Dígito encontrado.

REM Regreso al método 'SetCombo',
REM Modificando el índice inicial para
REM proseguir el String por el índice del dígito repetido.
Call Set /A "StartIndex=%%x"
Goto :SetCombo

) || (

REM Dígito NO encontrado.

REM Añado el dígito a la combinación.
Set "Combo=!Combo!%ValueDelimiter%!Value!"
REM :: Debug
REM Echo !Combo!

)
)

REM Le hago un arreglo al String para darle el formato correcto.
Set "Combo=!Combo:~2!"
REM :: Debug
REM Echo !Combo!

REm Compruebo si el Combo existe en archivo de Combos.
(Type "!CombosFile!"|Find.exe "!Combo!")1>Nul && (

REM Combo encontrado.

REM Vuelta a empezar, a generar el combo desde Cero.
Call Set /A "StartIndex=0"
Goto :SetCombo

) || (

REM Combo NO encontrado.

REM Añado el combo al archivo de Combos.
(Echo !Combos!%ComboDelimiter%!Combo!)>>"%CombosFile%"
REM :: Debug
REM Echo !Combo!

)

REM Reseteo el valor de las variables.
Set /A "StartIndex=0"
Set /A "Value=0"
Set "Combo="

REM Vuelvo al punto de llamada.
Goto:EOF

Output del archivo de Combos:
Código:
2, 9, 6, 0, 3, 7, 8, 1, 4, 5
4, 2, 1, 9, 5, 6, 0, 3, 7, 8
2, 0, 8, 5, 6, 3, 1, 7, 4, 9
3, 8, 1, 5, 6, 9, 4, 2, 0, 7
9, 3, 6, 8, 4, 0, 5, 2, 7, 1
2, 6, 3, 5, 1, 7, 8, 0, 9, 4
8, 4, 2, 9, 5, 1, 6, 3, 7, 0
5, 8, 1, 0, 2, 3, 9, 7, 6, 4
8, 7, 0, 2, 4, 3, 9, 1, 6, 5
7, 8, 3, 1, 0, 6, 5, 2, 4, 9

Output del ejemplo de ayuda (" REM Ejemplo de como procesar cada valor de cada combo"):
Código:
Combinacion: 2, 9, 6, 0, 3, 7, 8, 1, 4, 5
Valor: 2
Valor: 9
Valor: 6
Valor: 0
Valor: 3
Valor: 7
Valor: 8
Valor: 1
Valor: 4
Valor: 5
« Última modificación: 18 Julio 2014, 03:40 am por Eleкtro » En línea



AquilesBailo

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: [Ayuda](Batch) 10 Numeros random del 1 al 10
« Respuesta #5 en: 7 Febrero 2015, 01:50 am »

Yo soy nuevo en esto lo intente pero paso esto.

los números crean un bug en el código y dos números se repiten "aveces" aunque no deberían.

el código:

Código
  1. @echo off
  2. title bat
  3. :as
  4. cls
  5. set/a asd= 1
  6. set/a asd1= %random:~0,1%
  7. set/a asd2= %random:~0,1%
  8. set/a asd3= %random:~0,1%
  9. set/a asd4= %random:~0,1%
  10. set/a asd5= %random:~0,1%
  11. set/a asd6= %random:~0,1%
  12. set/a asd7= %random:~0,1%
  13. set/a asd8= %random:~0,1%
  14. set/a asd9= %random:~0,1%
  15.  
  16. if %asd1%==%asd% set/a asd1= %asd1% +1
  17. if %asd2%==%asd% set/a asd2= %asd2% +1
  18. if %asd3%==%asd% set/a asd3= %asd3% +1
  19. if %asd4%==%asd% set/a asd4= %asd4% +1
  20. if %asd5%==%asd% set/a asd5= %asd5% +1
  21. if %asd6%==%asd% set/a asd6= %asd6% +1
  22. if %asd7%==%asd% set/a asd7= %asd7% +1
  23. if %asd8%==%asd% set/a asd8= %asd8% +1
  24. if %asd9%==%asd% set/a asd9= %asd9% +1
  25.  
  26. if %asd2%==%asd9% set/a asd2= %asd9% +1
  27. if %asd3%==%asd9% set/a asd3= %asd9% +1
  28. if %asd4%==%asd9% set/a asd4= %asd9% +1
  29. if %asd5%==%asd9% set/a asd5= %asd9% +1
  30. if %asd6%==%asd9% set/a asd6= %asd9% +1
  31. if %asd7%==%asd9% set/a asd7= %asd9% +1
  32. if %asd8%==%asd9% set/a asd8= %asd9% +1
  33. if %asd1%==%asd9% set/a asd1= %asd9% +1
  34.  
  35. if %asd2%==%asd8% set/a asd2= %asd8% +1
  36. if %asd3%==%asd8% set/a asd3= %asd8% +1
  37. if %asd4%==%asd8% set/a asd4= %asd8% +1
  38. if %asd5%==%asd8% set/a asd5= %asd8% +1
  39. if %asd6%==%asd8% set/a asd6= %asd8% +1
  40. if %asd7%==%asd8% set/a asd7= %asd8% +1
  41. if %asd1%==%asd8% set/a asd1= %asd8% +1
  42. if %asd9%==%asd8% set/a asd9= %asd8% +1
  43.  
  44. if %asd2%==%asd7% set/a asd2= %asd7% +1
  45. if %asd3%==%asd7% set/a asd3= %asd7% +1
  46. if %asd4%==%asd7% set/a asd4= %asd7% +1
  47. if %asd5%==%asd7% set/a asd5= %asd7% +1
  48. if %asd6%==%asd7% set/a asd6= %asd7% +1
  49. if %asd1%==%asd7% set/a asd1= %asd7% +1
  50. if %asd8%==%asd7% set/a asd8= %asd7% +1
  51. if %asd9%==%asd7% set/a asd9= %asd7% +1
  52.  
  53. if %asd2%==%asd6% set/a asd2= %asd6% +1
  54. if %asd3%==%asd6% set/a asd3= %asd6% +1
  55. if %asd4%==%asd6% set/a asd4= %asd6% +1
  56. if %asd5%==%asd6% set/a asd5= %asd6% +1
  57. if %asd1%==%asd6% set/a asd1= %asd6% +1
  58. if %asd7%==%asd6% set/a asd7= %asd6% +1
  59. if %asd8%==%asd6% set/a asd8= %asd6% +1
  60. if %asd9%==%asd6% set/a asd9= %asd6% +1
  61.  
  62. if %asd2%==%asd5% set/a asd2= %asd5% +1
  63. if %asd3%==%asd5% set/a asd3= %asd5% +1
  64. if %asd4%==%asd5% set/a asd4= %asd5% +1
  65. if %asd1%==%asd5% set/a asd1= %asd5% +1
  66. if %asd6%==%asd5% set/a asd6= %asd5% +1
  67. if %asd7%==%asd5% set/a asd7= %asd5% +1
  68. if %asd8%==%asd5% set/a asd8= %asd5% +1
  69. if %asd9%==%asd5% set/a asd9= %asd5% +1
  70.  
  71. if %asd2%==%asd4% set/a asd2= %asd4% +1
  72. if %asd3%==%asd4% set/a asd3= %asd4% +1
  73. if %asd1%==%asd4% set/a asd1= %asd4% +1
  74. if %asd5%==%asd4% set/a asd5= %asd4% +1
  75. if %asd6%==%asd4% set/a asd6= %asd4% +1
  76. if %asd7%==%asd4% set/a asd7= %asd4% +1
  77. if %asd8%==%asd4% set/a asd8= %asd4% +1
  78. if %asd9%==%asd4% set/a asd9= %asd4% +1
  79.  
  80. if %asd2%==%asd3% set/a asd2= %asd3% +1
  81. if %asd1%==%asd3% set/a asd1= %asd3% +1
  82. if %asd4%==%asd3% set/a asd4= %asd3% +1
  83. if %asd5%==%asd3% set/a asd5= %asd3% +1
  84. if %asd6%==%asd3% set/a asd6= %asd3% +1
  85. if %asd7%==%asd3% set/a asd7= %asd3% +1
  86. if %asd8%==%asd3% set/a asd8= %asd3% +1
  87. if %asd9%==%asd3% set/a asd9= %asd3% +1
  88.  
  89. if %asd1%==%asd2% set/a asd1= %asd2% +1
  90. if %asd3%==%asd2% set/a asd3= %asd2% +1
  91. if %asd4%==%asd2% set/a asd4= %asd2% +1
  92. if %asd5%==%asd2% set/a asd5= %asd2% +1
  93. if %asd6%==%asd2% set/a asd6= %asd2% +1
  94. if %asd7%==%asd2% set/a asd7= %asd2% +1
  95. if %asd8%==%asd2% set/a asd8= %asd2% +1
  96. if %asd9%==%asd2% set/a asd9= %asd2% +1
  97.  
  98. if %asd2%==%asd1% set/a asd2= %asd1% +1
  99. if %asd3%==%asd1% set/a asd3= %asd1% +1
  100. if %asd4%==%asd1% set/a asd4= %asd1% +1
  101. if %asd5%==%asd1% set/a asd5= %asd1% +1
  102. if %asd6%==%asd1% set/a asd6= %asd1% +1
  103. if %asd7%==%asd1% set/a asd7= %asd1% +1
  104. if %asd8%==%asd1% set/a asd8= %asd1% +1
  105. if %asd9%==%asd1% set/a asd9= %asd1% +1
  106.  
  107. echo %asd% %asd9% %asd2% %asd7% %asd4% %asd6%
  108.  
  109. %asd3% %asd5% %asd1% %asd8%

PD: el programa no sirve para nada.
« Última modificación: 7 Febrero 2015, 11:46 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [Ayuda](Batch) 10 Numeros random del 1 al 10
« Respuesta #6 en: 7 Febrero 2015, 13:35 pm »

@AquilesBailo

Está prohibido revivir temas antiguos, si tienes una duda, crea un post nuevo.
También debes utilizar las etiquetas GeShi para insertar código.



No entiendo muy bien lo que intentas hacer, pero siguiendo la linea del script del ejemplo que has mostrado, AquilesMuestro un ejemplo de como se podría llevar a cabo la distinción:

Código
  1. @Echo OFF
  2.  
  3. :: Inicializo las variables con números aleatorios del 0 al 9.
  4. Set /A "val1=%RANDOM% %%9", "val2=%RANDOM% %%9", "val3=%RANDOM% %%9"
  5. Set /A "val4=%RANDOM% %%9", "val5=%RANDOM% %%9", "val6=%RANDOM% %%9"
  6. Set /A "val7=%RANDOM% %%9", "val8=%RANDOM% %%9", "val9=%RANDOM% %%9"
  7.  
  8. :: Aumentar el valor del primer parámetro (%val1%)
  9. :: hasta que no coincida con el resto de parámetros (%val2%, %val3%, %val4%, %val5%, %val6%, %val7%, %val8% ,%val9%)
  10. Call :DoWhile "%val1%" "%val2%" "%val3%" "%val4%" "%val5%" "%val6%" "%val7%" "%val8%" "%val9%"
  11. :: Asigno el ""valor de retorno"" del bloque ":DoWhile".
  12. Set /A "val1=%DoWhileResult%"
  13.  
  14. REM Repetir el mismo proceso de arriba con los demás valores...
  15.  
  16. Call :DoWhile "%val2%" "%val1%" "%val3%" "%val4%" "%val5%" "%val6%" "%val7%" "%val8%" "%val9%"
  17. Set /A "val2=%DoWhileResult%"
  18.  
  19. Call :DoWhile "%val3%" "%val1%" "%val2%" "%val4%" "%val5%" "%val6%" "%val7%" "%val8%" "%val9%"
  20. Set /A "val3=%DoWhileResult%"
  21.  
  22. Call :DoWhile "%val4%" "%val1%" "%val2%" "%val3%" "%val5%" "%val6%" "%val7%" "%val8%" "%val9%"
  23. Set /A "val4=%DoWhileResult%"
  24.  
  25. Call :DoWhile "%val5%" "%val1%" "%val2%" "%val3%" "%val4%" "%val6%" "%val7%" "%val8%" "%val9%"
  26. Set /A "val5=%DoWhileResult%"
  27.  
  28. Call :DoWhile "%val6%" "%val1%" "%val2%" "%val3%" "%val4%" "%val5%" "%val7%" "%val8%" "%val9%"
  29. Set /A "val6=%DoWhileResult%"
  30.  
  31. Call :DoWhile "%val7%" "%val1%" "%val2%" "%val3%" "%val4%" "%val5%" "%val6%" "%val8%" "%val9%"
  32. Set /A "val7=%DoWhileResult%"
  33.  
  34. Call :DoWhile "%val8%" "%val1%" "%val2%" "%val3%" "%val4%" "%val5%" "%val6%" "%val7%" "%val9%"
  35. Set /A "val8=%DoWhileResult%"
  36.  
  37. Call :DoWhile "%val9%" "%val1%" "%val2%" "%val3%" "%val4%" "%val5%" "%val6%" "%val7%" "%val8%"
  38. Set /A "val9=%DoWhileResult%"
  39.  
  40. Echo Valores: %val1%, %val2%, %val3%, %val4%, %val5%, %val6%, %val7%, %val8%, %val9%
  41. Pause&Exit
  42.  
  43. :DoWhile
  44. Set /A "currentValue=%~1"
  45. If "%currentValue%" EQU "0" (Set /A "currentValue=1")
  46.  
  47. Set /A "tmpValue=currentValue + 1"
  48. If "%tmpValue%" EQU "10" (Set /A "tmpValue=1")
  49.  
  50. Set "recall=False"
  51. If "%~1" EQU "%~2" (Set "recall=True")
  52. If "%~1" EQU "%~3" (Set "recall=True")
  53. If "%~1" EQU "%~4" (Set "recall=True")
  54. If "%~1" EQU "%~5" (Set "recall=True")
  55. If "%~1" EQU "%~6" (Set "recall=True")
  56. If "%~1" EQU "%~7" (Set "recall=True")
  57. If "%~1" EQU "%~8" (Set "recall=True")
  58. If "%~1" EQU "%~9" (Set "recall=True")
  59.  
  60. If /I "%recall%" EQU "True" (
  61. Call :DoWhile "%tmpValue%" "%~2" "%~3" "%~4" "%~5" "%~6" "%~7" "%~8" "%~9"
  62. ) ELSE (
  63. Set /A "DoWhileResult=%currentValue%"
  64. Goto :EOF
  65. )

Output:
Código:
Valores: 2, 9, 5, 8, 6, 7, 1, 4, 3
Presione una tecla para continuar . . .

Tema Cerrado.

Saludos
« Última modificación: 7 Febrero 2015, 13:42 pm por Eleкtro » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
AYUDA!! Sobre un programa de numeros Random y Timer ??
Programación Visual Basic
Laura_12 1 1,661 Último mensaje 4 Junio 2007, 23:26 pm
por Jareth
Random: Numeros Aleatorios
.NET (C#, VB.NET, ASP)
MANULOMM 3 13,505 Último mensaje 15 Julio 2007, 14:20 pm
por Meta
Ayuda con numeros random en arrays
.NET (C#, VB.NET, ASP)
Edu 6 4,272 Último mensaje 6 Diciembre 2010, 23:09 pm
por Edu
Problema con numeros random en shell scripting
Scripting
titopown 0 1,782 Último mensaje 10 Marzo 2016, 16:44 pm
por titopown
[BATCH] Generador de números aleatorios/random
Scripting
Tino 0 3,130 Último mensaje 26 Noviembre 2017, 14:00 pm
por Tino
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines