C, 707 bytes
New lines and whitespace added for legibility:
u[256][256]={0};
char Y[2000];
char X[500]="u[256][256]={0};char Y[2000];char X[500]=\"@\";main(){int n,m,i,k;char*a=X,*b=X,*y=Y;for(;*a!=64;*y=*a,y++,a++);for(;*b;*y=*b,y++,b++){if(*b==92||*b==34){*y=92;y++;}}for(a++;*a;*y=*a,y++,a++);*y=0;for(a=Y;*a;a++)u[*a][*(a+1)]++;m='u';do{putchar(m);for(k=i=0;i<256;i++)k+=u[m][i];n=rand()%k;for(i=0;i<256;i++){if(n<u[m][i])break;n-=u[m][i];}m=i;}while(m);}";
main(){
int n,m,i,k;
char*a=X,*b=X,*y=Y;
for(;*a!=64;*y=*a,y++,a++);
for(;*b;*y=*b,y++,b++){if(*b==92||*b==34){*y=92;y++;}}
for(a++;*a;*y=*a,y++,a++);*y=0;
for(a=Y;*a;a++)u[*a][*(a+1)]++;
m='u';
do{ putchar(m);
for(k=i=0;i<256;i++)k+=u[m][i];
n=rand()%k;
for(i=0;i<256;i++){
if(n<u[m][i])break;
n-=u[m][i];
} m=i;
}while(m);
}