算法导论(三)之随机算法

版权声明:欢迎大家转载,指正。 https://blog.csdn.net/yin__ren/article/details/83239658

随机化算法讲解推荐阅读

随机化算法


1. 随机数

1. 通过线性同余算法实现

  1. 用线性同余法生成“伪”随机数
  2. 算法java实现–概率算法–随机数

博主并没有搞懂,为什么要这样实现线性同余算法,知道是同志麻烦在评论区告知一下

2. 通过 Java 的 UUID 生成

public static String randomUUID() {  
    return UUID.randomUUID().toString().replace("-", "");  
}  

UUID 实现的 Java 源码:

public static UUID randomUUID() {
        SecureRandom ng = Holder.numberGenerator;

        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6]  &= 0x0f;  /* clear version        */
        randomBytes[6]  |= 0x40;  /* set to version 4     */
        randomBytes[8]  &= 0x3f;  /* clear variant        */
        randomBytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(randomBytes);
    }
private UUID(byte[] data) {
        long msb = 0;
        long lsb = 0;
        assert data.length == 16 : "data must be 16 bytes in length";
        for (int i=0; i<8; i++)
            msb = (msb << 8) | (data[i] & 0xff);
        for (int i=8; i<16; i++)
            lsb = (lsb << 8) | (data[i] & 0xff);
        this.mostSigBits = msb;
        this.leastSigBits = lsb;
    }
private static class Holder {
        static final SecureRandom numberGenerator = new SecureRandom();
    }
public String toString() {
        return (digits(mostSigBits >> 32, 8) + "-" +
                digits(mostSigBits >> 16, 4) + "-" +
                digits(mostSigBits, 4) + "-" +
                digits(leastSigBits >> 48, 4) + "-" +
                digits(leastSigBits, 12));
    }

二、数值概率算法

1. 用随机投点法计算pi值

设有一半径为r的圆及其外切四边形。向该正方形随机地投掷n个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为(PI * pow(r,2)) / (4 * pow(r,2)) = PI / 4 。所以当n足够大时,k与n之比就逼近这一概率。从而,PI 约等于 (4*k)/n

 public static double darts(int n){
        long k = 0;
        for (int i = 0;i < n;i++){
            double x = Math.random();
            double y = Math.random();
            if (x * x + y * y <= 1.0){
                k++;
            }
        }
        return (double) (4 * k) / (double)n;
    }

2. 计算定积分

假设向单位正方形内随机地投入n个点(xi,yi)。如果有m个点落入G内,则随机点落入G内的概率:
I = m / n I = m / n

//假设函数 y=x * x
public static double darts(int n){
        long k = 0;
        for (int i = 0;i < n;i++){
            double x = Math.random();
            double y = Math.random();
            if (y < x * x){
                k++;
            }
        }
        return (double)k / (double)n;
    }

3. 解方程组

1. 牛顿法解非线性方程组

2. 列主元素消去法求解线性方程组

3. LU 分解法求解线性方程组

三、舍伍德(Sherwood)算法

四、拉斯维加斯(Las Vegas)算法

五、蒙特卡罗(Monte Carlo)算法

猜你喜欢

转载自blog.csdn.net/yin__ren/article/details/83239658