If you want to spawn particles on the surface of a mesh, it's relatively easy: pick a random triangle, then pick a random point on it. The choice of triangle should be weighted by area so that the particles don't clump into the denser areas of the mesh (unless that is a desirable effect).
To spawn particles within the volume enclosed by a mesh is harder. Rejection sampling - generating random points in the bounding box of the model, then checking if they're inside and throwing away the ones that aren't - will work, but I suspect it isn't very efficient, as you'll generate many points you won't use. Still might be worth a try. To test whether a point is inside the mesh, see this StackOverflow question, which points out that you only need a 2D acceleration structure, not full 3D, to make this work. But you're still going to be doing a bunch of ray-triangle tests to determine whether a point is inside or outside the volume.
If you did build a full 3D acceleration structure, such as a BSP or BVH, there's probably a way to use it to focus the generation of points. For instance, you could pre-calculate the volume of each BSP leaf node, then generate a point by picking a random leaf node weighted by volume and generating a random point within it. That sounds difficult, though - both calculating the volume of a BSP node and picking a random point within it sound nontrivial.