Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: kenonni en 24 Abril 2014, 00:11 AM

Título: Rellenar vector con 1 y -1 aleatoriamente
Publicado por: kenonni en 24 Abril 2014, 00:11 AM
Hasta ahora lo mejor que he conseguido es esto, pero es problema es que rand() no trabaja con 0, si alguien me puede ayudar se lo agradecería.


#include <iostream>
#include <cmath>
using namespace std;
int main()
{
   



    int e=100;
   
    int M=2;
    int N=2;
    int Y=3;
    int T=2;
   

    double v[e];
    double u[e];
   
   
    for(int i=0; i< e+1;i++){
       
        if (u==2){
           
            u=0;}
        else {
           
 
     
    v = rand () % (N-M+1) + M;
       
    u = rand () % (T-Y+1) + Y;

            cout<<v-u<<endl;}
}
   
   
   

    system("pause");
    return 0;
}
Título: Re: Rellenar vector con 1 y -1 aleatoriamente
Publicado por: engel lex en 24 Abril 2014, 01:34 AM
Código (cpp) [Seleccionar]
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int e=100;
    int M=2;
    int N=2;
    int Y=3;
    int T=2;
   
    double v[e];
    double u[e];
   
    for(int i=0; i< e+1;i++){
       
        if (u==2){
           
            u=0;}
        else {
     
    v = rand () % (N-M+1) + M;
       
    u = rand () % (T-Y+1) + Y;

            cout<<v-u<<endl;}
}
    system("pause");
    return 0;
}


realmente  no se que intentaste con N-M XD ambos son 2

por otro lado... u y v son vector de 100 espacios de double... pero los llenas como si fueran numero... eso debería darte error

i<e+1 no entiendo el por qué... debería darte un error... estás accediendo valores más allá del array

cmath no contiene rand() es cstdlib

tu codigo tiene muchos errores :s como compila?

procura no usar nombres de variables en mayusculas...

para tu problema panteado como tal debes hacer:
rand()%2 eso devolverá 1 y 0 si es 1 lo dejas así, si es 0 lo multiplicas por -1
Título: Re: Rellenar vector con 1 y -1 aleatoriamente
Publicado por: eferion en 24 Abril 2014, 09:50 AM
Cita de: engel lex en 24 Abril 2014, 01:34 AM
tu codigo tiene muchos errores :s como compila?

Directamente no compila. No se ha molestado ni tan siquiera en corregir los errores de compilación:

Código (cpp) [Seleccionar]

   int e=100;

   double v[e];
   double u[e];


Para que esto compile, "e" debe ser constante... y no lo es... o pones "e" como constante o usas new y delete para crear y destruir los vectores.

Código (cpp) [Seleccionar]
if (u==2){

u es un arreglo... no se puede comparar con un entero así por las buenas... no tiene sentido... ¿Qué intentas comprobar aquí? ¿La posición de memoria? ¿El valor del primer elemento de "u"?

Código (cpp) [Seleccionar]
u=0;}

Lo mismo que en el apartado anterior. "u" es un arreglo o vector... ¿Pretendes cambiar el valor de algún elemento concreto? ¿La dirección apuntada por el arreglo? ¿?

Código (cpp) [Seleccionar]

v = rand () % (N-M+1) + M;
u = rand () % (T-Y+1) + Y;


No puedes convertir así a bote pronto un entero en un arreglo... estamos ante el mismo problema que en los dos casos anteriores... para acceder a una posición concreta de un arreglo, en tu caso "u" y "v", tienes que usar un índice ( u[0]=3, almacenamos un 3 en la primera posición del vector "u" )... obviamente ese índice puede venir dado por una variable:

Código (cpp) [Seleccionar]

for ( int i=0; i < 4; i++ )
 u[ i ] = i * 2;


Además de todo esto, no queda claro si los valores de 1 y -1 vienen determinados por alguna expresión matemática o, como se puede intentar adivinar, simple azar.

Para sacar únicamente valores 1 y -1 hay varias opciones:

Código (cpp) [Seleccionar]

// una opcion
v[ i ] = ( rand( ) % 2 ) ? 1 : -1;

// otra
int valores[] = { 1, -1 };
v[ i ] = valores[ rand( ) % 2 ];

// otra
v[ i ] = -1 + 2 * ( rand( ) % 2 );

// esta suponiendo que v es un vector de tipo int, no float
v[ i ] = 1 ^ ( 0xFFFFFFFE * ( rand( ) % 2 ) );


No hay límites a la imaginación.


Título: Re: Rellenar vector con 1 y -1 aleatoriamente
Publicado por: leosansan en 24 Abril 2014, 14:29 PM

Como ya te comentaron, te sobra la librería <cmath> y te faltan la <cstlib> y <ctime> para el uso de rand y time, además de <iomanip> por si quieres que salgan separados una cierta distancia los 1 de los -1 y un k%25 para agruparlos en la salida de 25 en 25 y que no salgan un montón de 1 y -1 unos debajo de otros. Por no hablar de que no inicializas la semilla de los números aleatorios:

Código (cpp) [Seleccionar]
srand((unsigned) time(NULL));

Por otro lado haces e=100 y después declaras u[e], es decir podrías haber hecho directamente u[100]. Pero si la idea es poder variar la dimensión del array, mejor usar un:

Código (cpp) [Seleccionar]
#define E   100

Y así sólo tienes que cambiar el valor de E en un solo sitio.

Mi propuesta coincide con una de las propuestas por eferion, sólo que espaciando los 1 y -1 y una salida en bloques de 25 en 25:


Código (cpp) [Seleccionar]
for(int i=0; i< E;i++,k++){
    if (k%25==0)
      cout<<endl;
    u[i]=-1+2*(rand()%2);
    cout<<setw(3)<<u[i];
  }


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Rellenar vector con 1 y -1 aleatoriamente
Publicado por: kenonni en 9 Mayo 2014, 13:18 PM
muchas gracias por todo!