나는이라는 클래스를 만들었고 QuickRandom
그 임무는 임의의 숫자를 빠르게 생성하는 것입니다. 정말 간단합니다. 이전 값에 a를 곱하고 double
소수 부분을 취하십시오.
여기 내 QuickRandom
수업 전체가 있습니다 :
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;
}
}
그리고 그것을 테스트하기 위해 작성한 코드는 다음과 같습니다.
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);
}
이전의 double에 "magic number"double을 곱하는 매우 간단한 알고리즘입니다. 나는 그것을 함께 빨리 던 졌으므로 아마 더 나아질 수는 있지만 이상하게도 잘 작동하는 것 같습니다.
다음은 main
메소드 에서 주석 처리 된 행의 샘플 출력입니다 .
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
흠. 꽤 무작위입니다. 사실, 그것은 게임에서 난수 생성기에 효과적입니다.
주석 처리되지 않은 부분의 샘플 출력은 다음과 같습니다.
5456313909
1427223941
와! 보다 거의 4 배 빠른 성능을 발휘합니다 Math.random
.
나는 어딘가에 미친 모듈러스와 나눗셈 을 Math.random
사용한 것을 읽은 것을 기억 System.nanoTime()
합니다. 정말 필요한가요? 내 알고리즘은 훨씬 빠르게 수행되며 꽤 무작위로 보입니다.
두 가지 질문이 있습니다.
- 내 알고리즘이 "충분히"(예를 들어, 실제로 임의의 숫자가 그렇게 중요하지 않은 게임 )입니까?
Math.random
단순한 곱셈과 십진수를 잘라내는 것으로 충분할 때 왜 그렇게 많은 일을합니까?
new QuickRandom(0,5)
또는을 시도하십시오 new QuickRandom(.5, 2)
. 그것들은 당신의 숫자에 대해 반복적으로 0을 출력합니다.