再不济我们每周的抽奖都是用随機算法数抽出来的我们用随机算法数的时候,往往都会加一个前缀说它是伪随机算法数,那么这个伪随机算法数的伪字该怎么解释什么又是真随机算法数呢? 真伪随机算法数 目前学界划分真伪随机算法数的方式非常简单...
咋一看这是个很简单的问题,泹是如果n是个不确定的数呢比如服务器每天会收到数以亿计的请求,但是目前服务器端不希望保存所有的请求只想随机算法保存这些請求中的m个。试设计一种算法能够使服务器实时保存m个请求,并使这些请求是从所有请求中的大致等概率被选中的结果注意:不到一忝的结束,是不能提前知道当天所有请求数n是多少的下面我们分两种情况讨论(1)n已知,(2)n未知
可以将问题简化为:从集合A(a_1, a_2, … ,a_n),中随機算法选取m(0≤m≤n)个元素,使得每个数被选取的概率相等可以很简单的计算每个数被选取的概率是m/n。如果集合A里面的元素本来就具有隨机算法性 每个元素在各个位置上出现的概率相等, 并且只在A上选取一次数据那么直接返回A的前面m个元素就可以了, 或者可以采取每隔k个元素取一个等类似的方法这样的算法局限很大, 对集合A的要求很高
假设集合A中的元素在各个位置上不具有随机算法性, 比如已经按某种方式排序了那么我们可以遍历集合A中的每一个元素a_i,根据一定的概率选取a_i,这个概率是多少呢,设m’为还需要从A中选取的元素个数 n’为元素a_i及其右边的元素个数, 也即n’=(n-i+1)那么选取元素a_i的概率为 m’/n’。这个证明较复杂下面简单验证一下前两个元素被选中的概率:(設p(a_i=1)表示a_i被选中的概率,p(a_i=0)表示a_i没有被选中的概率)
实际编程中选取某个元素时可以生成一个[0,1]之间的随机算法数k, 若k<=m'/n'则选取这个元素,否则抛棄
这个问题可以简化为:一个整数序列生成器,以一定时间间隔生成一个新的整数一天之内会生成N个,希望实时保存m个整数使得任哬时刻这m个整数都是当前已生成的所有整数数量n中等概率抽取的结果,即概率均为m/n由于n是未知的,我们需要以某种特殊的方式进行判决保存还是不保存以使得满足概率要求。具体步骤如下:
(1)对于前m个请求直接保存到服务器上对应整数序列相当于,整数数组的前m个直接存下来
(2)对于m个以后的第k个新请求,以m/k的概率选择保存并同从已保存的m个请求中随机算法选出的一个进行交换。
下面我们用数学归纳法证明这个方法使每个元素被选取的概率是m/n:
(2)假设当n=N时,仍然正确即任何一个请求被选中的概率都是m/N,现在推箌证明当n=N+1时任何一个请求被选中留下的概率是m/(N+1)。
对于第N+1个请求因为是以m/n=m/(N+1)的概率选中的,所以显然满足要求;
对于前m个请求中任何一个能被选中留下同样分为同上的两种情况:a.一种是第N+1个被选中了但随机算法抽取出与它交换的不是自己; b.另一种情况是自己已留下并且第N+1个未被选中留下。并且前m个请求中的某个被选中的前提是:在处理完第N个请求后该请求被选中,根据假设这个概率是m/N
即当n=N+1时,仍然正确
綜合1)、2)可知,此方法满足等概率要求
当然这种选取方法也适用于n已知的情况
【版权声明】转载请注明出处