मैंने एक कक्षा बुलायी QuickRandom
, और इसका काम यादृच्छिक संख्याओं का उत्पादन करना है। यह वास्तव में सरल है: बस पुराना मान लें, एक से गुणा करें 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);
}
यह एक बहुत ही सरल एल्गोरिथ्म है जो बस पिछले डबल को "मैजिक नंबर" डबल से गुणा करता है। मैंने इसे बहुत जल्दी से एक साथ फेंक दिया, इसलिए मैं शायद इसे बेहतर बना सकता था, लेकिन अजीब तरह से, यह ठीक काम कर रहा है।
यह 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 करेंगे।