আমি বলা একটি ক্লাস তৈরি করেছি 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 আউটপুট হবে।