One method would be to scatter() some points, create 20m radius spheres at each point, remove spheres that occlude, and then further remove points using p() according to an attribute. This won't let you remove exactly 20% of the original number of points though.
@Range(min=0, max=1)
attr reduce = 0
const nPoints = 100
const minDist = 20
const cube_width = 10
Lot -->
scatter(surface, nPoints, uniform) { Point }
Point -->
s(2*minDist, 2*minDist, 2*minDist)
center(xz)
primitiveSphere
label("sphere")
TestSphere
TestSphere -->
case overlaps(intra, "sphere"):
NIL
else:
ReducePoints
ReducePoints -->
case p(reduce):
NIL
else:
s(cube_width, cube_width, cube_width)
center(xz)
primitiveCube