洗牌算法
数据量可知
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main() {
srand(time(0));
int n, a[100];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", a+i);
}
for (int i = 0; i < n; i++)
{
int t = a[i];
a[i] = a[rand() % n];
a[rand() % n] = t;
}
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
}
水池算法
- 特点:可以随机求取数据量未知数据集中一条数据
- 时间复杂度:O(n)
- 原理:
对数据量大小为n的数据集编号:从1到n
取随机数,当随机数可以被编号整除覆盖随机值,重复操作直到遍历完数据
此时对任意一条数据被选中的概率都是:1/n
理解的话简单看一下第一条数据被选中的情况:1×1/2×2/3×3/4…×(n-1)/n 约分到最后剩一个1/n,同理任意位置都可以约分为1/n,因而任意位置被选中的概率相同。
参考随机求取链表数据
/*
struct node{
int val;
node*next;
};
*/
int find_rand(){
int n=1,res=0;
for(node*p=head;p;p=p->next){
if(rand()%n==0){
res=p->val;
}
}
return res;
}