版权声明:欢迎大家转载,指正。 https://blog.csdn.net/yin__ren/article/details/83239658
随机化算法讲解推荐阅读
随机化算法
1. 随机数
1. 通过线性同余算法实现
博主并没有搞懂,为什么要这样实现线性同余算法,知道是同志麻烦在评论区告知一下
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内的概率:
//假设函数 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;
}