Rellenar vector con 1 y -1 aleatoriamente

Iniciado por kenonni, 24 Abril 2014, 00:11 AM

0 Miembros y 1 Visitante están viendo este tema.

kenonni

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;
}

engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

eferion

#2
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.



leosansan


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! ..... !!!!





kenonni