Not too unexpected/outrageous.
Not to go into too much detail about the implementation but... Follicles are placed on a per face bases, generally if you have a large amount of follicles on a small amount of faces things will average out to be the set distribution value per square centimetre. If you have a small amount of hair on lot of faces the algorithm won't give as a even distribution, but this is a unusual case for hair/fur.
Now here's where the oddity starts coming in.
This doesn't really answer you problem but anyway...
So when you create a Garibaldi Node and connect a Geometry node (normally with the dialog provided), then open the Garibaldi Editor for the first time the current worldspace pose/position is cached for use in the editor.
This pose is used for follicle distribution amounts regardless of how you change the pose/position is the Daz scene (but the hair position etc updates). This is done to guarantee what you get in the Garibaldi Editor is what is rendered in Daz and when geometry has animation the same amount of follicles are created to make sure no jumping/flickering of hairs happen. Think about as an animal moves their skin stretches so the surface area of the skin changes. At any time you can update the geometry used by the Garibaldi Editor by using the update button in the Setup workspace.
I don't know why you get different results using a script and the Daz UI, Garibaldi uses the geometry the Daz would use to render.
On a side note...
If you use very dense overlapping hair you might find memory usage is high when rendering (especially when the hair is semi transparent), reducing the render bucket size (may slow render speed) and reducing pixel samples (lower render quality) will reduce memory usage