So, as you’ve already seen, the spread value of Spawn Rate is ignored. This is a bug and it should be fixed somehow, either by removing the spread or using the value in a reasonable way. But what is a reasonable way? If you consider the spread value of Spawn Rate and compare it to the spread value of the other properties then all the rest of them operate on the particles themselves while the Spawn Rate would instead apply to the emitter.
Every update of an emitter we currently increment a ParticlesToSpawn counter with Spawn Rate * dt. Every frame (uint)ParticlesToSpawn particles are spawned and the ParticlesToSpawn is decremented by this amount.
How does the spread value of Spawn Rate fit into this system? We could every frame instead increment ParticlesToSpawn with (SpawnRate + rand[-1,1] * spread) * dt and get some randomness going based on the spread value (or perhaps rand[0,1] * spread). This would solve what you want to achieve in your example @AGulev and avoid that all particles spawn in total sync from multiple emitters with the same properties. But is it obvious to the user what the spread value actually does?
The spread value of Initial Size makes immediate sense and the outcome is obvious and predictable. Initial Size 32 and spread 16 means that particles will have an initial size ranging from 16 to 48.
What does a Spawn Rate of 10 and spread of 5 mean? What would the user expect?
Finally, there’s the issue of a negative Spawn Rate, which is currently not handled either. You can curve Spawn Rate and let it be negative and receive some pretty weird results. This also needs to be take into consideration. Probably by treating a negative Spawn Rate as 0.