0

El programa corre, pero siempre me genera la misma secuencia de números. Alguien podría revisarlo y darme una mano? Estoy utilizando las siguientes librerías: iostream time.h iomanip

#define N 3
#define M 3

using namespace std;

int main(void)
{
    int mat[N][M];
    int i;
    for (i = 0; i < N*M; i++)
    {
        mat[i / M][i % M] = (rand() % M - rand() % M) ;
    }
    cout << "\n\nLa matriz ingresada es:";
    for (i = 0; i < N*M; i++)
    {
        if (!(i % M))cout << endl;
        cout <<setw(5)<< mat[i / M][i%M];
    }
    cout << endl;
}
1
  • Error básico. Deberían haberlo explicado en donde te enseñaron sobre rand. Ya te hago una respuesta, mientras te dejo con una lectura: old.chuidiang.org/clinux/funciones/…).
    – DABL03
    Commented el 30 jun. a las 2:15

1 respuesta 1

1

Esto sucede porque no has declarado una semilla. Los números aleatorios en programación no existen.

Entonces si no existe, ¿como hacen los juegos para generar mundos aleatorios?. Esto lo logran con los número pseudoaleatorio.

¿Que son?, y conque se comen?: Son unas serie de formulas compleja, que logran hacer una secuencia de números aparentemente aleatorios. Pero al ser una formula y usar siempre los mismos números base, siempre generaran las mismas secuencia de números.

¿Entonces como genero números aleatorios con esto?. Para solucionar el problema de siempre generar la misma secuencia usamos una semilla o un número base: srand(100);. Pero igual genera secuencia repetida, así que aprovechemos de algo variable como el tiempo transcurrido o el ID del proceso. Estos dos varían durante todo el programa (el tiempo) o con cada ejecución del programa (ID del proceso) y así lograr una secuencia de números casi aleatorios. Un ejemplo de uso es el Minecraft.

Usando el tiempo:

#include <stdlib.h>// srand y rand
#include <time.h> // time
#include <stdio.h>//printf

#define MIN 10
#define MAX 20
int main(void){
  srand(time(NULL));//Establecemos la semilla o el número base para rand
  for (int iCount=0;iCount<10;iCount++)
    printf("El número aleatorio actual es: %d\n",rand () % (MAX-MIN+1) + MIN);
  return 0;
}

Ahora con el número de proceso, pero antes debes saber que esto varia con Windows y Linux. Para solucionar esto podemos usar pre-procesadores:

#include <stdlib.h>// srand y rand
#include <stdio.h>//printf

//Si es windows, se compila lo siguiente:
#ifdef _WIN32
  #include <process.h> // _getpid
  // definimos getpid para simplificar todo despues.
  #define getpid _getpid

//Si no es windows, se compilará lo siguiente:
#else
  #include <unistd.h> // getpid
#endif

#define MIN 10
#define MAX 20
int main(void){
  srand(getpid());//Establecemos la semilla o el número base para rand
  for (int iCount=0;iCount<10;iCount++)
    printf("El número aleatorio actual es: %d\n",rand () % (MAX-MIN+1) + MIN);
  return 0;
}

Y listo. Ya preparaste rand para generar números aleatorios. El código deberia quedar asi:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define N 3
#define M 3

using namespace std;

int main(void)
{
    srand(time(NULL));
    int mat[N][M];
    int i;
    for (i = 0; i < N*M; i++)
    {
        mat[i / M][i % M] = (rand() % M - rand() % M) ;
    }
    cout << "\n\nLa matriz ingresada es:";
    for (i = 0; i < N*M; i++)
    {
        if (!(i % M))cout << endl;
        cout <<setw(5)<< mat[i / M][i%M];
    }
    cout << endl;
}

Enlaces externos:

3
  • 1
    Recalcar que la semilla debe establecerse una sola vez. He visto gente que llama srand constantemente y como la ejecución es muy rápida, la precisión del tiempo casi no cambia así que la semilla es la misma; por lo tanto la secuencia de números aleatorios se restablece y obtienen el mismo número una y otra vez.
    – Mateo
    Commented el 30 jun. a las 4:09
  • 1
    Según la documentación, si se usa rand antes de establecer una semilla, el comportamiento esperado es el mismo que si hubieras utilizado srand(1) previamente.
    – Mateo
    Commented el 12 jul. a las 15:57
  • @Mateo Sip, Yo me imagino como si fuera una constante a nivel global que está inicializada en 1. (no se llama a srand(1), sino que ya está asi)
    – DABL03
    Commented el 13 jul. a las 12:25

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.