How do I create a random point on the surface of a cube? I mean on one of its six faces at random.
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}]]
-
-
$\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 ofRandomPoint[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
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]
-
$\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
andBoundary
but forget aboutRegionBoundary
! 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 inPolygon
. Mathematica would have to run planarity checks when callingRandomPoint
. 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 simplicialMeshRegion
s. And an automatica conversion would have also its pitfalls. But I agree that I was also puzzled first when I realized thatRandomPoint@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
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
.
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