Java : 700
Here's a recursive wall adding algorithm, adapted from this site:
public class Z{int i,j,u=20,v=u,g[][]=new int[v][u];public static void main(String[]a){new Z().d(0,0,20,20,0).p();}int q(int m){return(int)(Math.random()*m);}<T>void z(T m){System.out.print(m);}void p(){for(i=0;i++<u*2;z("_"));for(i=0;i<v;i++){z("\n|");for(j=0;j<u;j++){boolean b=i+2>v,s=g[i][j]%2>0||b;z(s?"_":" ");z(g[i][j]>1||j+2>u?"|":s&(j+1<u&&g[i][j+1]%2>0||b)?"_":" ");}}}Z d(int x,int y,int w,int h,int o){int a=x,b=y,c=a,d=b,e,f;boolean t=o<1;if(t){b+=q(h-2);c+=q(w);}else{a+=q(w-2);d+=q(h);}for(i=t?w:h;i-->0;j=t?a++:b++)if(a!=c&&b!=d)g[b][a]|=t?1:2;e=t?w:a-x+1;f=t?b-y+1:h;if(e>2&&f>2)d(x,y,e,f,e<f?0:1);e=t?w:x+w-a-1;f=t?y+h-b-1:h;if(e>2&&f>2)d(t?x:a+1,t?b+1:y,e,f,e<f?0:1);return this;}}
Basically, it splits each rectangle in two with a wall (and passage), then splits those in two, etc. It generates a "perfect" maze - one with no cycles - that has a path from every point to every other point. Plenty of dead ends, so it's not "trivial" in any sense for larger mazes.
So, the entrance and exit can be decided arbitrarily. If I have to choose one, It'll just say top/left and bottom/right.
It's drawn in double-width ascii, so it's a good idea to pipe output to a file if you're doing one of any size. Here's a 20x20 in console:

And a 100x100 in notepad++ (I had to zoom out to get ti all, so it's somewhat... small):

Code with line breaks:
public class Z{
int i,j,u=20,v=u,g[][]=new int[v][u];
public static void main(String[]a){
new Z().d(0,0,20,20,0).p();
}
int q(int m){return(int)(Math.random()*m);}
<T>void z(T m){System.out.print(m);}
void p(){
for(i=0;i++<u*2;z("_"));
for(i=0;i<v;i++){
z("\n|");
for(j=0;j<u;j++){
boolean b=i+2>v,s=g[i][j]%2>0||b;
z(s?"_":" ");
z(g[i][j]>1||j+2>u?"|":s&(j+1<u&&g[i][j+1]%2>0||b)?"_":" ");
}
}
}
Z d(int x,int y,int w,int h,int o){
int a=x,b=y,c=a,d=b,e,f;
boolean t=o<1;
if(t){
b+=q(h-2);
c+=q(w);
}
else{
a+=q(w-2);
d+=q(h);
}
for(i=t?w:h;i-->0;j=t?a++:b++)
if(a!=c&&b!=d)
g[b][a]|=t?1:2;
e=t?w:a-x+1;f=t?b-y+1:h;
if(e>2&&f>2)d(x,y,e,f,e<f?0:1);
e=t?w:x+w-a-1;f=t?y+h-b-1:h;
if(e>2&&f>2)d(t?x:a+1,t?b+1:y,e,f,e<f?0:1);
return this;
}
}