C# solution
Intuition\nIf we can move all the non-blacklist numbers to consecutive cells, then it will be easy to get random numbers with equal probability. For this proble
**Intuition**\nIf we can move all the non-blacklist numbers to consecutive cells, then it will be easy to get random numbers with equal probability. For this problem, we can logically achieve this goal by mapping the ```numbers in the blacklist``` to ```numbers in the non-blacklist```.\n\n**Complexity**\n- Time\n\t- Constructor: O(n)\n\t- Pick(): O(1)\n- Space: O(n) for the Dictionaory\n\n**Implementation**\n```\npublic class Solution {\n\n    private Dictionary<int,int> blacklistDic;\n    private int whitelistNumCnt;\n    private Random random;\n    \n    public Solution(int n, int[] blacklist) {\n    \n        random = new Random();\n        \n        blacklistDic = new Dictionary<int,int>();      \n        foreach(int num in blacklist)\n            blacklistDic.Add(num,-1);\n        \n        whitelistNumCnt = n - blacklistDic.Count;\n        \n        // map a blacklist number to a whitelist number\n        foreach(var blacklistNum in blacklistDic.Keys)\n        {\n            // only do the mapping for blacklist number that is between [0, whitelist), since we only want to get numbers from non-blacklist\n            if(blacklistNum < whitelistNumCnt)\n            {\n                // starting from n-1, find the mapping whitelist number for each blacklist number\n                while(n >= 0 && blacklistDic.ContainsKey(n - 1))\n                    n--;              \n                blacklistDic[blacklistNum] = n - 1;\n                n--;\n            }\n        }        \n    }\n    \n    public int Pick() {\n        \n        int res = random.Next(0, whitelistNumCnt);\n        \n        return blacklistDic.ContainsKey(res)?  blacklistDic[res] : res;\n    }\n}\n```
[]