Ver Mensaje Individual
  #3 (permalink)  
Antiguo 07/06/2011, 09:50
rapers
 
Fecha de Ingreso: junio-2011
Mensajes: 3
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Resolver 10 números siguiente a una serie en C++

He hecho algo,y mucho.El tema consiste en que mi profe ha cambiado las semillas de la función rand() por default para generar los números aleatorios y pueden ser un valor entre 1 y 2^32.La rutina te da 15 bits de 32 bits de la serie y los desplaza.He probaro el algoritmo de berlekamp-massey en mathlab y en .c y me he creado un código que averigua la semilla pero es un proceso muy lento:
#include "stdio.h"
#include "math.h"

long comprobar(long posicion,long num){

long lista[1000];
long i=0;

if(lista[0]!=17678){
FILE * f;

f=fopen("afin.txt","r");
while(!feof(f) && i<10){
fscanf(f,"%ld",&lista[i]);


printf("lista[%ld]:%ld\n",i,lista[i]);
i++;
}
fclose(f);

}


if (lista[posicion]==num)
return 1;
else
return 0;
}

void main(int argc,char *argv[]){
long m=3;
long a;
long c;
long x;

int j,ska;

//La estamos peinando

long inicialA=1L;
long finalA=(inicialA<<31)-1;

long inicialC=1;
long finalC=(inicialC<<10);

printf("Datos iniciales:\n");
printf("A irá de %ld a %ld\n",inicialA,finalA);
printf("C irá de %ld a %ld\n",inicialC,finalC);

for(c=inicialC;c<=finalC;c++){
if (c%100==0)
printf("\n\nc:%ld\n",c);
for(a=inicialA;a<=finalA;a++){
//printf("\na:%ld\n",a);
j=0;
ska=0;
x=17678;
//Este while es para comprobar si se están hallando los números de la serie
while(j<8 && ska==0){
if (comprobar(j,x)==1){
j++;
//Con 7 coincidencias terminaría... (habría q poner 1000 y tal)
if (j==7){
ska=88;
printf("Cerdo a la vista!!=)\n");
printf("a:%ld\n",a);
printf("c:%ld\n\n",c);
}
else if (j>2){
printf("Coincidencias:%d\n",j);

}
}
else{
//Esto es para salir del while si no coincide con el nº de la serie!
ska=1;
}
//El algoritmo del tipo!
x=((a*x+c)>>16)&0x7fff;
}
}
}

printf("Esto ha acabado, fijate cuanto ha tardado porq el definitivo sería 4000 veces más\n\n");
printf("Risas!\n");
}

"afin.txt" es un texto con los 1000 números de la serie.