几种随机算法的实现原理
转自:http://www.androidstar.cn/%E5%87%A0%E7%A7%8D%E9%9A%8F%E6%9C%BA%E7%AE%97%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/ 在日常工作中,经常需要使用随机算法。比如面对大量的数据, 需要从其中随机选取一些数据来做分析。 又如在得到某个分数后, 为了增加随机性, 需要在该分数的基础上, 添加一个 扰动 , 并使该扰动 服从特定的概率分布 ( 伪随机 )。本文主要从这两个方面出发, 介绍一些算法, 供大家参考。 首先假设我们有一个使用的随机函数float frand(), 返回值在(0, 1)上均匀分布。大多数的程序语言库提供这样的函数。 在其他的语言如C/C++中, 可以通过间接方法得到。如 frand()= ((float)rand() ) / RAND_MAX; 1, 随机选取数据 假设我们有一个集合A(a_1,…,a_n), 对于数m,0≤m≤n, 如何从集合A中 等概率地 选取m个元素呢? 通过计算古典概率公式可以得到, 每个元素被选取的概率为m/n。 如果集合A里面的元素本来就具有随机性, 每个元素在各个位置上出现的概率相等, 并且只在A上选取一次数据,那么直接返回A的前面m个元素就可以了,