
Geometry Nodes:

The total density is the sum of the two densities.
The probability of a point being a sphere is the sphere density divided by the total density.
$$\text{For N Instances}$$


What this does is, first create a mesh line with an edge count equal to the object count in the collection, then it uses the density values to set the length of the edges, while keeping them stacked in a line. With this done, it generates a random with the interval $[0, S]$, with $S$ being the sum of all densities. The random is then used as a vector to get the nearest edge's index, which will be the index for picking an instance.
For every object added to the collection, you will need to add another Index Density Node Group to the node chain and connect the last sum to the Density Max socket of the Distribute Points on Faces Node.

The index of a density doesn't need to be specified since the chain of Index Density Nodes already calculates it, starting with 0 and adding 1 for each node.

You should also rename your objects in the collection since the index of objects inside comes from the alphabetical ordering of their names. That way, adding a new object to the collection will not change the index of the others.


Also, if you rename an object inside the collection, the index order will not update, for updating it, you just drag an objet which is inside the collection to the same collection.
Another thing is that some of the small cyllinders sometimes disappears, this is due to the distance from the bigger objects changing, this can be solved by calculating the distance to the objects before transforming them.
Here the transformation is done to the instances, not the points:

The instances before the transformation are the ones sent to proximity calculation.
Update with using normals

For using normals of the deformed plane while using the original position to generate points, we capture the normals from the deformed plane to the original, we will also capture the position. Doing this, points are generated in the original mesh, but they hold anonymous attributes with the deformed position and normal, which we then use to set their position and rotation.


