Java solution with just call one Random() for each Pick()!!!666
So for the first Random, we can get a Point which is already random and uniform, then We just need to represent it based on its Index in the corresponding Rect.
So for the first Random, we can get a Point which is already random and uniform, then We just need to represent it based on its Index in the corresponding Rect. \n```\n    int[][] rects;\n    TreeMap<Integer, Integer> map;\n    Random random;\n    int sum = 0;\n    public Solution(int[][] rects) {\n        this.rects = rects;\n        map = new TreeMap<>();\n        random = new Random();\n        for (int i = 0; i < rects.length; i++) {\n            int[] rect = rects[i];\n            sum += (rect[2] - rect[0] + 1) * (rect[3] - rect[1] + 1);\n            map.put(sum, i);\n        }\n    }\n    \n    public int[] pick() {\n        int randInt = random.nextInt(sum) + 1;\n        int key = map.ceilingKey(randInt);\n        int index = key - randInt;        if randInt is 5 and the key is 6, so the index = 1 means its second point in that Rect. \n        int[] rect = rects[map.get(key)];\n        int left = rect[0], bottom = rect[1], right = rect[2], top = rect[3];\n        int x = left + index  % (right - left + 1);\n        int y = bottom + index / (right - left + 1);\n        return new int[]{x, y};\n    }\n\t```
[]