复联4中灭霸一个响指能够随机消灭一半生命,Github 上的灭霸脚本能够随机删除一半服务器文件。我在想怎么作到随机删除一半的文件呢??随机算法的底层怎么实现的?这两天抽时间整理了答案。html
let "i=`find . -type f | wc -l`/2";
if [[ uname=="Darwin" ]]; then
find . -not -name "Thanos.sh" -type f -print0 | gshuf -z -n $i | xargs -0 -- cat;
else
find . -not -name "Thanos.sh" -type f -print0 | shuf -z -n $i | xargs -0 -- cat;
fi
复制代码
为了完全读懂这段脚本,特地查了几个关键字let、find、shuf/gshuf、xargs。linux
大体解释下,let "i=`find . -type f | wc -l`/2";
将i赋值为服务器普通文件行数的一半。git
if [[ uname=="Darwin" ]]
应该是用来判断系统是 Mac or Linux 的,Linux 用 shuf
作随机,Mac 用 gshuf
。github
find . -not -name "Thanos.sh" -type f -print0 | gshuf -z -n $i | xargs -0 -- cat;
找到全部名称不是 Thanos.sh
的普通文件,随机选取 $i
个,并将这些做为参数执行 cat
操做,真正删除将 cat
改成 rm
便可。算法
例如获取 [0,100) 区间的随机数。服务器
final long l = System.currentTimeMillis();
final int i = (int) (l % 100);
复制代码
例如获取 int 的随机数。微信
final double d = Math.random();
final int i = (int) (d*100);
复制代码
我看了 Math.random()
的源码,也是调用 Random
类的方法。dom
// Math.random() 实现
public static double random() {
return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
// RandomNumberGeneratorHolder 实际上是 Random 类
private static final class RandomNumberGeneratorHolder {
static final Random randomNumberGenerator = new Random();
}
// nextDouble() 方法在 Random 类中的实现
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27)) * DOUBLE_UNIT;
}
复制代码
Random
类提供贼多随机方法,返回的类型不一样,提供两个构造器。ide
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}
}
复制代码
方法的话,看一下方法名就知道干啥了的吧。 ui
源码看得挺困难,网上找的资料表示 Random 的随机算法有一下特色:
算法用到了线性同余方程。下期我学完后整理下资料,分享出来。
随机数算法都是伪随机数,从参数传入的那一刻,之后的输出是特定的了。目前产生真随机数的是这个东东。
龟龟,用到量子力学了。我也只看了点皮毛,当课外知识扩展吧。
emmm,有兴趣的推荐看汪洁老师讲的课,我以为他对物理这块科普的挺好的,还包括相对论、天文、外星人等等
欢迎关注微信公众号,提供感悟和技术文章,偶尔抽奖,期待和你一块儿进步。微信搜索小兵张健或扫描如下二维码。