Best way to make particle lines on cylinder
Here's a shader approach. I'm not going to illustrate the tree; it's (perhaps unnecessarily?) big, and most of it isn't interesting - it's just plumbing to recover things like cell-centers from a randomized cell-grid.
This though, is the principle that's being followed:

A 1D Voronoi texture gives us distances from randomly-distributed centers in the U dimension. (stripes, on the left).
Another 1D Voronoi texture gives us stripes in the V dimension in the same way. But this time, the texture is shifted per U-stripe, by adding a multiple of the 'R' of the random-per-stripe Color output of the first, U, Voronoi, to the V Voronoi's location in its one dimension. (shifted stripes, center)
The two Voronoi textures are intersected, by considering the U Voronoi and the shifted V Voronoi as the X and Y of a vector, and taking its length.
The Object Info node &gt; Random output is used as a lookup into a White Noise texture to shift the entire space in which these texures are calculated. This gives a random-per-object result.
The linked .blend shows you the tree that does this, and a node group made from it.
The node group has the inputs:

Object Seed: randomizes the textures on all objects
X and Y 'Gaps' This modifies the 'Gappiness' - the average space between stripes, and dots-in-stripes.
X and Y Randomness. The lower these numbers, the more closely the texture approaches a regular grid. Tweaking this  a little can avoid dot-collisions.
Dot Size
Y BaseLine.  A margin below which dots will not appear, masked in such a way not to clip any dots. We could add a top margin that works the same way, if needed.

The Outputs are:

Mask. A mask of the dots, white out of black.
Distance: the distance of the shading-point from the nearest dot.
Cell center: the location of the center of the Voronoi cell containing the dot, in the original UV space. A sort of 2D 'Dot ID', could be useful for coloring dots separately, etc.

The group is used in the .blend to produce this:

If you go for this approach, with Node Wrangler enabled, you could Ctrl-Shift click around the nodes to figure out what the tree is up to.. and maybe improve it :)