Ben denilen bir sınıf yaptım QuickRandom
ve onun işi hızla rastgele sayılar üretmektir. Gerçekten basit: Eski değeri alın, a ile çarpın double
ve ondalık kısmı alın.
İşte QuickRandom
sınıfım bütünüyle:
public class QuickRandom {
private double prevNum;
private double magicNumber;
public QuickRandom(double seed1, double seed2) {
if (seed1 >= 1 || seed1 < 0) throw new IllegalArgumentException("Seed 1 must be >= 0 and < 1, not " + seed1);
prevNum = seed1;
if (seed2 <= 1 || seed2 > 10) throw new IllegalArgumentException("Seed 2 must be > 1 and <= 10, not " + seed2);
magicNumber = seed2;
}
public QuickRandom() {
this(Math.random(), Math.random() * 10);
}
public double random() {
return prevNum = (prevNum*magicNumber)%1;
}
}
Ve test etmek için yazdığım kod:
public static void main(String[] args) {
QuickRandom qr = new QuickRandom();
/*for (int i = 0; i < 20; i ++) {
System.out.println(qr.random());
}*/
//Warm up
for (int i = 0; i < 10000000; i ++) {
Math.random();
qr.random();
System.nanoTime();
}
long oldTime;
oldTime = System.nanoTime();
for (int i = 0; i < 100000000; i ++) {
Math.random();
}
System.out.println(System.nanoTime() - oldTime);
oldTime = System.nanoTime();
for (int i = 0; i < 100000000; i ++) {
qr.random();
}
System.out.println(System.nanoTime() - oldTime);
}
Bu basit bir önceki çift ile bir "sihirli sayı" çift çarpma basit bir algoritma. Çok hızlı bir şekilde bir araya getirdim, bu yüzden muhtemelen daha iyi yapabilirdim, ama garip bir şekilde, iyi çalışıyor gibi görünüyor.
Bu main
yöntemdeki yorum satırlarının örnek çıktısıdır :
0.612201846732229
0.5823974655091941
0.31062451498865684
0.8324473610354004
0.5907187526770246
0.38650264675748947
0.5243464344127049
0.7812828761272188
0.12417247811074805
0.1322738256858378
0.20614642573072284
0.8797579436677381
0.022122999476108518
0.2017298328387873
0.8394849894162446
0.6548917685640614
0.971667953190428
0.8602096647696964
0.8438709031160894
0.694884972852229
Hm. Oldukça rastgele. Aslında, bu bir oyunda rastgele bir sayı üreteci için işe yarayacaktır.
Yorumlanmamış kısmın örnek çıktısı:
5456313909
1427223941
Vaov! Neredeyse 4 kat daha hızlı performans gösterir Math.random
.
Math.random
Kullanılan bir yerde okuduğumu hatırlıyorumSystem.nanoTime()
ve tonlarca çılgın modül ve bölme şeyler . Bu gerçekten gerekli mi? Algoritmam çok daha hızlı çalışıyor ve oldukça rastgele görünüyor.
İki sorum var:
- Algoritmam "yeterince iyi" mi (örneğin, bir oyun için, gerçekten rastgele sayılar çok önemli değildir)?
- Neden
Math.random
sadece basit çarpma ve ondalık kesimi yeterli göründüğünde bu kadar çok şey yapar ?
new QuickRandom(0,5)
Veya deneyin new QuickRandom(.5, 2)
. Bunların her ikisi de numaranız için tekrar tekrar 0 verir.