题意理解
链表长度未知,从链表中随机选一个结点。
问题分析
蓄水池抽样
其他
https://www.geeksforgeeks.org/reservoir-sampling/
链接
private:
ListNode* head;
default_random_engine e; //无符号随机整数
public:
/** @param head The linked list's head.
Note that the head is guaranteed to be not null, so it contains at least one node. */
Solution(ListNode* head) {
this -> head = head;
}
/** Returns a random node's value. */
int getRandom() {
uniform_real_distribution<double> u(0,1); //0-1均匀分布
int res = head -> val; //初始化,取头结点
ListNode* p = head -> next; //指针指向下一个
int k = 1; //蓄水池长度
int i = 1; //从蓄水池外开始第一个数
while (p) { //遍历指针
double probability = u(e); //随机生成一个0-1之间的概率
cout << probability << endl;
double standard = k / (k + i * 1.0); //落入蓄水池的概率
if (probability <= standard) { 随机概率不大于蓄水池概率,说明?
res = p -> val; //
}
i ++; //递增
p = p -> next; //下一个元素
}
return res;
}