这个题因为不知道n是多大,不然直接对n取余即可。
所以这个题要用到蓄水池算法。
蓄水池算法编程珠玑上面有。
在不知道有多少个数的情况下,取出k个数,且每个数被取到的概率都相同。
第m个对象被选中的概率=选择m的概率*(其后元素不被选择的概率+其后元素被选择的概率*不替换第m个对象的概率),即
这道题的k就是1,如果不是1的话可以用
rand()%i<k来代替,当然替换的地方也要改动一下。
Solution(ListNode* head) {
p = head;
}
/** Returns a random node's value. */
int getRandom() {
// srand((int)time(0));
int val = p->val;
ListNode *tmp = p->next;
for(int i = 2;tmp;i++){
if(rand()%i == 0) val = tmp->val;
tmp = tmp->next;
}
return val;
}
另外注意这道题必须要用伪随机数才能过,真随机数过不了。。。
也是,真随机数没法判断了。