Generating Brainf*** NOPs
CJam, 118 116 bytes

This got slightly out of hand... especially the second half seems like it should be very golfable.

ri2/_)mr:R-"&lt;&gt;"R*mr_'=fm0\{1$+}%+__&amp;e`]:\{mr1aa..+}*\@](\z:~\{~\("+-"*mr1$3$e=[{_,)mr_2$&lt;@@&gt;}*+]@@f{`1$`={(}@?\}W&lt;}/


Test it here.

This handles N = 100 pretty much instantly. I don't have time to write the full breakdown of the code now, so here is the algorithm:


Generate a random balanced string of &lt; and &gt; with random (even) length between 0 and N inclusive.
Riffle the tape head positions into this array. E.g. "&lt;&gt;&gt;&lt;" becomes [0 '&lt; -1 '&gt; 0 '&gt; 1 '&lt; 0].
Get a list of all positions reached in the process.
For each such position initialise an empty string. Also determine how many pairs of characters are left to reach a string of length N.
For each remaining pair append +- to the string of a random position.
Shuffle all of those strings.
For each position determine how often that position occurs in the riffled array, and split the corresponding string into that many (random-length) chunks.
In the riffled array, replace the occurrences of the position with its random chunks.


Done. This is based on the observation that:


Any NOP must have an equal amount of &lt; and &gt; to return the tape head to the original position.
The code will be a NOP as long as each tape cell is incremented as often as decremented.


By distributing random but balanced amounts of +s and -s between all the places where the tape head is on a given cell, we ensure that we find every possible NOP.