What I have done is write down the chance of Obama or Romney getting a given state from his state-by-state numbers and then ran a simulation which assumes a given state going for a candidate does not affect the other states.
In more detail, using a strong random number generator (details below), I rolled a 1000-sided dice for each state and/or district with electoral votes. In this model, for example, Florida has a 63.3% percent chance of voting for Romney, so if the dice rolled a 367 or higher, I gave the state to Romney; otherwise I gave it to Obama.
I did this for all states and districts 100,000 times. The results were as follows:
Obama 81.9% Romney 16.8% Tie 1.3%I wonder why Nate is getting a 66.6% chance for Obama from the same numbers; perhaps he is coupling results more than I have (for example, if Romney gets Iowa in a given simulation, Nate probably lowers Obama's chances of getting Florida).
As an aisde, I also ran this simulation against some more liberal numbers from Huffpost; their numbers give Obama a 98.1% chance of winning.
What I have done is go through the results of my 100,000 run simulation and compared the chances of winning depending on how New Hampshire goes. Here are my results:
Obama wins New Hampshire
Obama wins election 83.5%
Electoral vote tie 1.4%
Romney wins election 15.1%
Romney wins New Hampshire
Obama wins election 77.9%
Electoral vote tie 1.0%
Romney wins election 21.1%
While New Hampshire has under 1% of the electoral votes in the nation, its influence on the election results, according to my model (loosely based on Nate's model) is 6%.
In summary: Voters in New Hampshire are best off getting out and voting, and voting for one of the two main candidates this election cycle. (Update The Nerd wallet numbers show a nearly identical 6% effect on the outcome).
For the record, here is the source code to the core of the random number generator:
/* Public domain crypto-strong random number generator; no warranty */ #include <stdint.h> #define rgp uint32_t #define rgf(a) for(c=0;c<a;c++) #define rgn rgf(3){w[c*13]^=s[c];u[16+c]^=s[c];}rgk(u,w); void rgk(rgp *a,rgp *b){rgp A[19],x,m=19,o=13,c,y,r=0,q[3],i=o;rgf(3){q [c]=b[c*o+12];}for(;--i;){rgf(3){b[c*o+i]=b[c*o+i-1];}}rgf(3){b[c*o]=q[ c];}rgf(12){i=c+1+(c%3*o);b[i]^=a[c+1];}rgf(m){y=(c*7)%m;r+=c;r%=32;x=a [y]^(a[(y+1)%m]|(~a[(y+2)%m]));A[c]=x>>r|x<<(32-r);}rgf(m){a[c]=A[c]^A[ (c+1)%m]^A[(c+4)%m];}a[0]^=1;rgf(3){a[c+o]^=q[c];}}void rgl(rgp *u, rgp *w,char *v){rgp s[3],q,c,r,x,d=0;rgf(19){u[c]=0;}rgf(39){w[c]=0;}for(;; ){rgf(3){s[c]=0;}for(r=0;r<3;++r){for(q=0;q<32;q+=8){*v?x=*v++:(d=x=1); s[r]|=x<<q;if(d){rgn;rgf(16){rgk(u,w);}return;}}}rgn;}}rgp rgi(rgp *m, rgp *b){static int a=2;a&2?rgk(m,b):0;a^=3;return m[a];}