Search code examples
schememit-scheme

Creating, Displaying and Returning Random Numbers


I need catch the numbers of function numerosR by separately because them I need know the major number, minor number and average of all numbers, but I don't know

this is my code:

(clear)
(display "Ingrese un Numero entre 10 y 40: ")
(define Numero (read))

; Funcion numerosRamdon genera numeros aleatoreos entre 10 y 150
; agrupados por columnas de 10 numeros

(define (numerosRandom)
  (define contador 1)
  (define contadorColumnas 1)
  (define (ciclo)
    (define numerosR (+ (random 141) 10))
    (if (and (>= Numero 10)
             (<= Numero 40)
             (<= contadorColumnas 10))
        (if (<= contador Numero)
            (begin
              (display numerosR)
              (display #\space)
              (set! contador (+ contador 1))
              (set! contadorColumnas (+ contadorColumnas 1))
              (ciclo)))
        (begin
          (newline)
          (set! contadorColumnas 1)
          (ciclo))))
  (ciclo))

(numerosRandom)

Solution

  • This code rewrites numerosRandom to separate generation of random numbers from their display. It also returns the random numbers as a list. The beginning of numerosRandom is unchanged.

    (define (numerosRandom)
    
      (define contador 1)
    

    Now circlo only does one thing. It creates a list of random numbers. Now circlo accepts one argument - a list for accumulating random numbers.

      (define (circlo accumulator)
        (define numerosR (+ (random 141) 10))
        (cond 
          ((= contador Numero)
           (reverse accumulator))
          (else
           (set! contador (+ contador 1))
           (circlo (cons numerosR accumulator)))))
    

    A new local function print-numerosR displays the random numbers.

      (define (print-numerosR numeros contadorColumnas)
        (cond ((null? numeros) "")
          ((<= contadorColumnas 10)
           (display (car numeros))
           (display #\space)       
           (print-numerosR (cdr numeros)
                   (+ contadorColumnas 1)))
          (else
           (newline)
           (display (car numeros))
           (display #\space)
           (print-numerosR (cdr numeros)
                   (+ contadorColumnas 1)))))
    

    A list of random numbers named numerosR is first generated, then displayed, then returned as a list.

      (define numerosR (circlo '()))
      (print-numerosR numerosR 0)
      numerosR)
    

    Notes

    Because the list of random numbers numerosR is the last item evaluated by numerosRandom it is always returned.

    It would be a good exercise to eliminate the mutation of contador by passing it as an additional value to circlo.