• Publicidad

Problema con rand()

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con rand()

Notapor francogonzalez » 2009-07-15 12:40 @569

Buen día, ¿me podrían ayudar con un problema que tengo con rand()...? Quiero generar 21 números aleatorios distintos para cada una de las variables (V, O, Ch, CO, CO2) pero lo quiero hacer 2 veces y que sean todos distintos...

Me genera correctamente los 21 aleatorios para cada uno pero me pone los mismos en la segunda corrida... ¿cómo puedo hacer que sean distintos?

Este es mi código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. srand();
  2. for ( $i=0; $i<2; $i++ )
  3.        
  4.         {      
  5.                 for ( $j=0; $j<21; $j++ )
  6.                 {
  7.                                
  8.                         $V = int (rand(6000));
  9.                         $O = int (rand(20));           
  10.                         $Ch = int (rand(50));
  11.                         $C0 = int (rand(5000));
  12.                         $C02 = int (rand(50));
  13.                        
  14.                         push(@Avel,$V);
  15.                         push(@Ao,$O);
  16.                         push(@Ach4,$Ch);
  17.                         push(@Aco,$C0);
  18.                         push(@Aco2,$C02);
  19.                        
  20.                         print "Valores reemplazo estación $j Vel = @Avel[$j], O2 = @Ao[$j], CH4 =@Ach4[$j] , CO = @Aco[$j], CO2 = @Aco2[$j].\n";
  21.                                
  22.                 }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
francogonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-07-15 12:13 @551

Publicidad

Re: Problema con rand()

Notapor explorer » 2009-07-15 13:47 @616

Bienvenido a los foros de Perl en Español, francogonzalez.

Cuando hablas de sacar 21 veces unos valores y eso repetirlo dos veces, estamos hablando de una sucesión de datos en dos dimensiones (2 veces por 21 secuencias).

En cambio, en el bucle más interior, estás sacando los valores guardados en arreglos (que solo tienen una dimensión).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my (@Avel, @Ao, @Ach4, @Aco, @Aco2);
  7.  
  8. srand();
  9.  
  10. for     my $i ( 0 ..  1 ) {
  11.     for my $j ( 0 .. 20 ) {
  12.         my $V   = int rand 6000;
  13.         my $O   = int rand 20;
  14.         my $Ch  = int rand 50;
  15.         my $C0  = int rand 5000;
  16.         my $C02 = int rand 50;
  17.  
  18.         push @Avel, $V;
  19.         push @Ao,   $O;
  20.         push @Ach4, $Ch;
  21.         push @Aco,  $C0;
  22.         push @Aco2, $C02;
  23.  
  24.         printf "Valores reemplazo estación %2d: Vel = %4d, O2 = %2d, CH4 = %2d, CO = %4d, CO2 = %2d.\n",
  25.                                             $j, $Avel[$j],  $Ao[$j], $Ach4[$j], $Aco[$j], $Aco2[$j];
  26.     }
  27. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Dicho de otra manera: estás generando, 21 veces, una serie de valores que los estás guardando en los arreglos. Cuando el bucle $i vuelve a comenzar por segunda vez, se vuelven a generar nuevas 21 veces secuencias de valores que quedan almacenados al final de los arreglos, por detrás de los primeros 21 valores, PERO en el printf() solo indicas que saquen los 21 primeros... no llegamos a ver los segundos.

La modificación es fácil. Si lo que queremos es que en los arreglos se guarden un total de 42 valores (dos secuencias de 21), ya lo tenemos. Pero lo que hay que arreglar, es cómo verlos: solo hay que cambiar la línea 25 del código anterior, por esta otra:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    $j, $Avel[$j+21*$i],  $Ao[$j+21*$i], $Ach4[$j+21*$i], $Aco[$j+21*$i], $Aco2[$j+21*$i];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y ya está, ya vemos todos los valores.

Sí que estabas generando los valores, pero no los veías. Ahora usamos $i como índice para acceder a los 21 segundos.

Y ahora que estamos seguros de que se generan esos 42 valores, podemos simplificar el programa, cambiando de nuevo la línea 25 por esta otra:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    $j, $V, $O, $Ch, $C0, $C02;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


porque esas variables guardan siempre los últimos valores generados.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con rand()

Notapor francogonzalez » 2009-07-15 15:49 @700

¡Muchas gracias!
francogonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2009-07-15 12:13 @551


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 13 invitados

cron