随机化算法及随机数的产生

快速排序与随机化:
快速排序是排序方法中较为便捷的方法之一,但是由于它极不稳定,
最坏的时候能达到与普通排序方法一样。
而制约快速排序的有两个:一是数据,越无序的数据,快排的速度越快;二是中间点的枚举。
因为两个制约条件都与随机有着不可分开的关系。
所以,在快速排序中加入随机化算法无疑是十分重要的。
运用在:
(1)数据读入时,随机排放数据位置。
(2)中间点的枚举进行多次随机化后决定。
这样就基本上将快速排序的时间复杂度维持在最好状态。
数值方法与随机化:
用随机投点法求 π的近似值:
设有一半径为r的圆及其外切四边形,如图所示。向该正方形随机投掷 n 个点。设落入圆内的点 k 在正方形上均匀分布,因而所投入点落入圆内的概率为 πr²/4r² = π/4 ,所以当n足够大时,kn之比就逼近这一概率(π/4)。由此可得使用随机投点法计算π值的数值概率算法。具体实现时,只需要在第一象限计算即可。 
double PI(int n)
{
  int k=0;
  for(int i=1;i<=n;i++)
  {
     double x=Random();
     double y=Random();
     if((x*x+y*y)<1)
        k++;
   }
  return 4*k/(double)n;
//π = 4k/n
}
一般情况下,可将概率(随机化)算法大致分为四类:数值概率算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法。

数值概率算法常用于数值问题的求解。这类算法所得到的往往是近似解。而且近似解的精度随计算时间的增加不断提高。在许多情况下,要计算出问题的精确解是不可能或没有必要的,因此用数值概率算法可得到相当满意的解。

蒙特卡罗(Monte Carlo)算法用于求问题的准确解。用蒙特卡罗算法能求得问题的一个解,但这个解未必是正确的。求得正确解的概率依赖于算法所用的时间。算法所用的时间越多,得到正确解的概率就越高。蒙特卡罗算法的主要缺点就在于此。一般情况下,无法有效判断得到的解是否肯定正确。

拉斯维加斯(Las Vegas)算法不会得到不正确的解,一旦用拉斯维加斯算法找到一个解,那么这个解肯定是正确的。但是有时候用拉斯维加斯算法可能找不到解。与蒙特卡罗算法类似。拉斯维加斯算法得到正确解的概率随着它用的计算时间的增加而提高。对于所求解问题的任一实例,用同一拉斯维加斯算法反复对该实例求解足够多次,可使求解失效的概率任意小。

舍伍德(Sherwood)算法总能求得问题的一个解,且所求得的解总是正确的。当一个确定性算法在最坏情况下的计算复杂性与其在平均情况下的计算复杂性有较大差别时,可以在这个确定算法中引入随机性将它改造成一个舍伍德算法,消除或减少问题的好坏实例间的这种差别。舍伍德算法精髓不是避免算法的最坏情况行为,而是设法消除这种最坏行为与特定实例之间的关联性。这意味着不存在坏的输入,只有坏的随机数。
 
这种算法看上去是凭着运气做事,其实,随机化算法是有一定的理论基础的。
随机化算法是一个很好的概率算法,但是它并不能保证正确,而且它单独使用的情况很少,大部分是与其他的算法:例如贪心、搜索等配合起来运用。
产生随机数最简单的方法是线性同余发生器:
Xi+1 = AXi mod M
前一个随机数Xi用于产生后一个随机数Xi+1,X0称为种子,一般使用系统时钟或1。
Lehmer 建议使用素数 M = 2 147 483 647, A = 48 271 。
为了避免32位机的溢出一般使用如下函数生成随机数:
static unsigned long Seed = 1;
#define A 48271L
#define M 2147483647L
#define Q ( M / A )
#define R ( M % A )
double Random( void )
{
       long TmpSeed;
       TmpSeed = A * ( Seed % Q )  - R * ( Seed / Q );
       if ( TmpSeed >= 0)
            Seed = TmpSeed;
       else
            Seed = TmpSeed + M;
       return  ( double ) Seed / M;
}
void Initialize ( unsigned long InitVal )
{
        Seed = InitVal;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值