This question already has an answer here:

How do I create a random point on the surface of a cube? I mean on one of its six faces at random.

marked as duplicate by Carl Woll, AccidentalFourierTransform, Michael E2, Community Aug 11 at 6:50

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • ListPointPlot3D[RandomSample /@ Transpose[RandomReal[{0, 1}, {2, 1000}]~Join~{RandomInteger[{0, 1}, 1000]}], BoxRatios -> {1, 1, 1}] – AccidentalFourierTransform Aug 10 at 23:47
up vote 3 down vote accepted
ReplacePart[Table[RandomReal[], 3], 
 RandomChoice[Range[3]] -> RandomInteger[{0, 1}]]

If you want points on the surface of a $d$-dimensional unit hypercube:

d = 5;
ReplacePart[Table[RandomReal[], d], 
RandomChoice[Range[d]] -> RandomInteger[{0, 1}]]
  • That's a very clever approach! – Henrik Schumacher Aug 10 at 20:10
  • I don't know about faster. Compared to RandomPoint[R, 1000], how long does your method take to generate 1000 random points? – Carl Woll Aug 10 at 20:36
  • @David G. Stork. That depends. If you count in the timing for discretizing the region: Yes, this takes a lot if time. But you have to do that only once. – Henrik Schumacher Aug 10 at 20:41
  • You used Table[RandomPoint[R], 10^6] instead of RandomPoint[R, 10^6]. The latter is about 3 orders of magnitude faster. – Carl Woll Aug 10 at 21:46
  • Ah... you are correct. I'll remove my timing claims. – David G. Stork Aug 10 at 22:03

We simply need a MeshRegion that represents the boundary of the unit cube. Then we apply RandomPoint to it. The following shows one of probably many ways to do it.

R = DiscretizeRegion@RegionBoundary[Cuboid[]];
RandomPoint[R]
  • Sorry, not into regions lately, will RegionBoundary be ok too?RandomPoint[DiscretizeRegion@RegionBoundary@Cuboid[], 500] – Kuba Aug 10 at 15:19
  • @Kuba Ah right! I tried all combinations of Mesh and Boundary but forget about RegionBoundary! Thank's for the hint. – Henrik Schumacher Aug 10 at 15:26
  • 1
    @kirma Yes. What I meant" RegionBoundary@Cuboid[] returns a list of quadrilaterals wrapped in Polygon. Mathematica would have to run planarity checks when calling RandomPoint. While this would be possible, I can understand that it would not be worthwhile to implement that, in particular since there is already an implementation for simplicial MeshRegions. And an automatica conversion would have also its pitfalls. But I agree that I was also puzzled first when I realized that RandomPoint@RegionBoundary@Cuboid[] does not evaluate. – Henrik Schumacher Aug 10 at 20:04
  • 2
    I believe the need for DiscretizeRegion is a bug, and should be reported. It used to work in 11.1. Also, it works in higher dimensions, e.g., RandomPoint @ RegionBoundary @ Cuboid[{0,0,0,0}, {1,1,1,1}]. – Carl Woll Aug 10 at 21:53
  • 1
    @CarlWoll Okay. I've just sent a report. – Henrik Schumacher Aug 10 at 22:02

Here is how to build it from scratch in case someone finds that interesting:

coords = {{0, 0, 0}, {0, 1, 0}, {1, 1, 0}, {1, 0, 0}, {0, 0, 1}, {0, 1, 1}, {1, 1, 1}, {1, 0, 1}};
pts = {{4, 3, 2, 1}, {1, 2, 6, 5}, {2, 3, 7, 6}, {3, 4, 8, 7}, {4, 1, 5, 8}, {5, 6, 7, 8}};
polygons = Flatten@Normal@GraphicsComplex[coords, Polygon[pts]];
reg = RegionUnion[DiscretizeRegion /@ polygons];
RandomPoint[reg]

I grabbed the coordinates from the documentation for Hexahedron.

  • Is it possible to find the coordinates of the point? – mattiav27 Aug 10 at 15:56
  • @mattiav27 What do you mean? RandomPoint returns coordinates. – C. E. Aug 10 at 17:57
  • I didn't know it thanks! – mattiav27 Aug 10 at 18:04

Not the answer you're looking for? Browse other questions tagged or ask your own question.