4
$\begingroup$

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

$\endgroup$
  • $\begingroup$ ListPointPlot3D[RandomSample /@ Transpose[RandomReal[{0, 1}, {2, 1000}]~Join~{RandomInteger[{0, 1}, 1000]}], BoxRatios -> {1, 1, 1}] $\endgroup$ – AccidentalFourierTransform Aug 10 '18 at 23:47
3
$\begingroup$
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}]]
$\endgroup$
  • $\begingroup$ That's a very clever approach! $\endgroup$ – Henrik Schumacher Aug 10 '18 at 20:10
  • $\begingroup$ I don't know about faster. Compared to RandomPoint[R, 1000], how long does your method take to generate 1000 random points? $\endgroup$ – Carl Woll Aug 10 '18 at 20:36
  • $\begingroup$ @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. $\endgroup$ – Henrik Schumacher Aug 10 '18 at 20:41
  • $\begingroup$ You used Table[RandomPoint[R], 10^6] instead of RandomPoint[R, 10^6]. The latter is about 3 orders of magnitude faster. $\endgroup$ – Carl Woll Aug 10 '18 at 21:46
  • $\begingroup$ Ah... you are correct. I'll remove my timing claims. $\endgroup$ – David G. Stork Aug 10 '18 at 22:03
5
$\begingroup$

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]
$\endgroup$
  • $\begingroup$ Sorry, not into regions lately, will RegionBoundary be ok too?RandomPoint[DiscretizeRegion@RegionBoundary@Cuboid[], 500] $\endgroup$ – Kuba Aug 10 '18 at 15:19
  • $\begingroup$ @Kuba Ah right! I tried all combinations of Mesh and Boundary but forget about RegionBoundary! Thank's for the hint. $\endgroup$ – Henrik Schumacher Aug 10 '18 at 15:26
  • 1
    $\begingroup$ @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. $\endgroup$ – Henrik Schumacher Aug 10 '18 at 20:04
  • 2
    $\begingroup$ 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}]. $\endgroup$ – Carl Woll Aug 10 '18 at 21:53
  • 1
    $\begingroup$ @CarlWoll Okay. I've just sent a report. $\endgroup$ – Henrik Schumacher Aug 10 '18 at 22:02
2
$\begingroup$

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.

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

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