Clean, straight forward Java solution with step-wise explanation
Process the input co-ordinates and transform into rectangle objects. Calculate the area of the rectangle and keep a total sum of areas. Use TreeMap to simulate 
1. Process the input co-ordinates and transform into rectangle objects. Calculate the area of the rectangle and keep a total sum of areas. Use TreeMap to simulate a ranged map where the rectangle occupies a range block proportional to its area. \n2.  The pick would only be uniform if the solution ensures weighted bias based on the rectange area. In other words, a larger rectangle has more points to pick from compared to a rectangle with smaller area. \n3.  Use random to pick a number between 1 and total sum of areas. The choice of TreeMap as the map implementation is intentional since it offers the *ceilingKey* function to round up to an end of the range / existent entry in the map. \n4.  Once a range and its appropriate rectangle is picked, the pick function in the rectangle object returns one valid x,y co-ordinates within the area of the rectangle, including on its perimeter. \n\nPlease **up-vote** if you like the solution and the explanation. \n\n```\n\tprivate Random random = new Random();\n\tprivate TreeMap<Integer, Rectangle> rectangles;\n\tprivate int areaSum = 0;\n    \n    public Solution(int[][] rects) \n    {\n        areaSum = 0;\n\t\trectangles = new TreeMap<Integer, Rectangle>();\n\t\tfor (int[] rect : rects)\n        {\n        \tRectangle rectangle = new Rectangle(rect);\n        \tareaSum = areaSum + rectangle.area;\n        \trectangles.put(areaSum, rectangle);\n        }\n    }\n    \n    public int[] pick() \n    {\n        Integer key = random.nextInt(areaSum) + 1;\n        return rectangles.get(rectangles.ceilingKey(key)).pick();\n    }\n    \n    private class Rectangle\n    {\n    \tpublic Rectangle(int[] coordinates)\n    \t{\n    \t\tleft = coordinates[0];\n    \t\tbottom = coordinates[1];\n    \t\tright = coordinates[2];\n    \t\ttop = coordinates[3];\n    \t\tarea = (right - left + 1) * (top - bottom + 1);    \t\t\n    \t}\n    \t\n    \tpublic int left, right; \n    \tpublic int top, bottom;\n    \tpublic int area;\n    \t\n    \tpublic int[] pick()\n    \t{\n    \t\tint x = left + random.nextInt(right - left + 1);\n    \t\tint y = bottom + random.nextInt(top - bottom + 1);\n    \t\treturn new int[]{x, y};\n    \t}\n    }\n```
[]