es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aumentar la cantidad de números para seleccionar al azar.

Hay un archivo por lotes que busca “Pen=n” en el archivo list.txt y cambia su valor (n) de manera aleatoria desde la fila de diez números dados (set “var[pen]=1 2 3 4 5 6 7 8 9 10”). Pero si hay más de diez números, por ejemplo veinte (set “var[pen]=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20”) o cien, sigue eligiendo un número de los primeros diez, ignorando el resto.

@echo off
setlocal EnableDelayedExpansion

set "file=D:\list.txt"
set "temp=D:\temp.txt"
set "var[pen]=1 2 3 4 5 6 7 8 9 10" &

for /L %%i in (1,10,1%time:~-2%) do set "rand=!random!"

(for /F "usebackq tokens=1,2 delims==" %%a in ("%file%") do (
   if defined var[%%a] (
      call :getRandomValue var="!var[%%a]!"
      echo %%a=!var!
   ) else if "%%b" neq "" (
      echo %%a=%%b
   ) else (
      echo %%a
   )
)) > "%temp%"

move /Y "%temp%" "%file%"

pause > nul && pause > nul
goto :EOF

:getRandomValue value="list"
set /A "rand=!random:~-1!+1"
for /F "tokens=%rand%" %%v in (%2) do set "%1=%%v"

Cualquier ayuda sería apreciada.

Editar:
El archivo list.txt contiene una lista de cosas como pluma, papel, goma de borrar, etc., con el valor correspondiente al lado.

pen=5
pencil=43
paper=0
rubber=22

Lo que hace el archivo por lotes es elegir un número aleatorio de la fila de números proporcionada. En el caso siguiente, cambiaría el valor de la pluma a un número aleatorio del 1 al 10. Pero si agrego algunos números extra más de diez, entonces los ignorará.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Descripción del problema
    El archivo por lotes actual busca el patrón “pen=n” en el archivo list.txt y cambia el valor de “n” por un número aleatorio de los primeros diez números en la fila “var[pen]”. Sin embargo, si hay más de diez números en la fila “var[pen]”, el programa ignora los números adicionales y aún selecciona un número aleatorio de los primeros diez.

    Solución
    Para solucionar el problema de ignorar los números adicionales cuando hay más de diez números en la fila “var[pen]”, debemos modificar el programa para generar un índice aleatorio basado en la cantidad de valores en la fila, en lugar de codificarlo como 10.

    Aquí está el archivo por lotes modificado:

    @echo off
    setlocal EnableDelayedExpansion
    
    set "file=D:\list.txt"
    set "temp=D:\temp.txt"
    
    (for /F "usebackq tokens=1,2 delims==" %%a in ("%file%") do (
        if "%%a" equ "pen" (
            set "values=%%b"
            set "count=0"
            for %%v in (!values!) do (
                set /A "count+=1"
                set "var[!count!]=%%v"
            )
            call :getRandomIndex count
            set "var[pen]=!var[%randomIndex%]!"
        ) else (
            echo %%a=%%b
        )
    )) > "%temp%"
    
    move /Y "%temp%" "%file%"
    
    pause > nul && pause > nul
    goto :EOF
    
    :getRandomIndex count
    set /A "rand=!random! %% %1 + 1"
    set "randomIndex=!rand!"
    

    Los cambios realizados en el script original son:

    • Se eliminó la línea set "var[pen]=1 2 3 4 5 6 7 8 9 10" & porque generaremos la fila “var[pen]” de manera dinámica basada en la cantidad de valores en la variable “values”.
    • El código para analizar la fila “var[pen]” se movió dentro del bloque “if” que verifica “pen=n”.
    • En lugar de codificar el rango de índices para generar un número aleatorio (de 1 a 10), calculamos la cantidad de valores en la variable “values” y generamos un índice aleatorio de 1 a la cantidad de valores.
    • Luego, el valor seleccionado se obtiene del array “var” usando el índice aleatorio.

    Con estos cambios, el archivo por lotes modificado debería seleccionar correctamente un valor aleatorio incluso si hay más de diez números en la fila “var[pen]”.

Comments are closed.