heh, 20% Pseudo-random, or 1/5 didn't think it'd actually turn out like that, I'll look at it.
I took a look at the source code. You use Math.random() for every plant at every tick. This will create a new java.util.Random() object. The random seed gets usually initialized with the current time in milli or nano seconds. As nearby
crops get updated nearly at the same tick time you will get the same Random seed and as a result the same random value. As I am not very familiar with Forge I can only help with standard Java stuff.
Edit: As a solution you can use a static (shared for all plants) java.util.Random. So the psydo random algorithm can do its work as intended. Benefit is also that you severly save on java.util.Random objects created. Drawback could be thread saftey as the instance is shared and as I said above, I have pretty much no idea about forge internals.