其实写这篇文章的原由是最近筹备在Java上写一个Perlin噪声的插件,所以对各类噪声函数有了一丢丢的相识,若有问题还请各人指正。转载的话但愿能注明出处。
留意,本教程中的随机函数均是形参为整形,返回值为区间[0,1)内的单精浮点数的函数。测试均为1~10000的随机数生成速度测试(1D – 输入x、2D – 输入x, y)。
更新记录
2016.1.22 – 初稿。
2016.1.28
(1) – 更新了Wichman-Hill随机数的算法,修改内容。增加了几个随机算法。
(2) – 统计出了各个要领较量后的分数。
随秘密领
1.Wichman-Hill 随机数发生器
Excel的随机函数曾用的要领,劳务派遣管理系统,参考文献:
直接上源码(2D请前去Github上查察):
/** * This is a method of Wichman-Hill random number generator. * * @param x * A seed for generator. * @return A float random value between [0.0,1.0) */ public static float randomWH(java.lang.Integer x) { int[] seed = new int[3]; seed[0] = (171 * x) % 30269; seed[1] = (172 * (30000 – x)) % 30307; seed[2] = (170 * x) % 30323; return (x / Math.abs(x)) * (seed[0] / 30269.0F + seed[1] / 30307.0F + seed[2] / 30323.0F) % 1.0F; }
以下是测试功效:
Start testing randomWH(), test: Generate 10000 numbers(1D).
Testing randomWH() completed, using time: 10 ms.Start testing randomWH(), test: Generate 10000 numbers(2D).
Testing randomWH() completed, using time: 7 ms.
还蛮乐观,可是图像就…
无论怎么改,照旧泛起了线性的趋势,颠簸很小……Orz
2.RSA 随机数发生器
RSA公钥算法各人都不会不熟悉吧,公认很靠谱的密钥算法。这里就是用了RSA的随机算法。参考:
其公式:C = (x * exp P) mod N(P是质数,N是两个质数之积)
这是Java代码:
/** * This is a method of RSA. * * @param x * A seed for generator. * @return A float random value between [0.0,1.0) */ public static float randomRSA(java.lang.Integer x) { return (float) (x * Math.exp(seedRSA[0]) % seedRSA[1] / seedRSA[1]); }
测试功效:
Start testing randomRSA(), test: Generate 10000 numbers(1D).
Testing randomRSA() completed, using time: 10 ms.Start testing randomRSA(), test: Generate 10000 numbers(2D).
Testing randomRSA() completed, using time: 9 ms.
从图像看出,软件开发,这个算法的随机性很赞。何况运算速度也不赖,适合利用。
3.Java 随机数发生器
Java自带的随机数(就是java.util.Random类),用过的都知道吧。那就直接上代码:
/** * This is a method of Java random number generator. * * @param x * A seed for generator. * @return A float random value between [0.0,1.0) */ public static float randomJava(java.lang.Integer x) { return (float) (new java.util.Random(1000 * x).nextDouble()); //乘1000来让种子间差距增大 }
这是测试数据:
Start testing randomJava(), test: Generate 10000 numbers(1D).
Testing randomJava() completed, using time: 11 ms.Start testing randomJava(), test: Generate 10000 numbers(2D).
Testing randomJava() completed, using time: 8 ms.
很是优秀的随机数算法,速度快并且根基看不出纪律。
4.简朴的随机数发生器
又是扫荡Google的战利品,软件开发,很歉仄健忘出处惹……代码:
/** * This is a method of basic random generator. * * @param x * A seed for generator. * @return A float random value between [0.0,1.0) */ public static float randomBasic(java.lang.Integer x) { x = (x << 13) ^ x; return (float) Math .abs((1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0)); }
测试功效:
Start testing randomBasic(), test: Generate 10000 numbers(1D).
Testing randomBasic() completed, using time: 9 ms.