পোস্টটি পড়া হয়েছে 780 বার
Android app development tutorial in Bengali

Android এ কটলিনের Random.nextLong() ব্যবহারে সতর্কতা

Post updated on 20th March, 2023 at 06:17 am

সম্প্রতি আমরা Random নাম্বার জেনারেট করতে গিয়ে বিশাল একটা বাগ প্রোডিউস করেছিলাম আমাদের Muslims Day অ্যাপে। এই অ্যাপের মূল ফিচার হচ্ছে সারা বছরের সাহরি ইফতার ও নামাজের সময়সূচী দেখানো। একটি বিশেষ ফিচার হচ্ছে অ্যাপে প্রতিদিন একটি করে আয়াত-হাদীসের Random লোকাল নোটিফিকেশন দেখায়।

Randomly নোটিফিকেশন ট্রিগার করার জন্য আমরা আগে Random.nextInt() ইউজ করতাম। রিসেন্টলি আমাদের এই ফিচারে কিছু চেঞ্জ এসেছে। চেঞ্জ করতে গিয়ে আমরা Random.nextLong() মেথডটা ইউজ করেছি। এখানেই শুরু হয় বিপত্তি।

Random.nextLong() issue in Kotlin

অ্যাপ আপডেট দেয়ার পর ইউজাররা রিপোর্ট করতে থাকেন যে তারা প্রতিদিন একই আয়াত বা হাদীস নোটিফিকেশনে পাচ্ছেন। অর্থাৎ আমাদের Random.nextLong() মেথডটা বেশির ভাগ সময়েই একই নাম্বার জেনারেট করছে। যা আমাদের ডেভ টেস্টিংয়ে ধরা পড়ে নি।

এর কারণ হিসাবে stackoverflow থেকে জানতে পারলাম কটলিনের ইন্টারনাল ইমপ্লিমেন্টেশনে random নাম্বার জেনারেট করার সময় যে seed value ইউজ হয় সেটি সব সময় একই থাকে। এর কারণে প্রতি বার একই নাম্বার জেনারেট হয়।

companion object Default : Random(), Serializable {
    private val defaultRandom: Random = defaultPlatformRandom()

    private object Serialized : Serializable {
        private const val serialVersionUID = 0L

        private fun readResolve(): Any = Random
    }

    private fun writeReplace(): Any = Serialized

    override fun nextBits(bitCount: Int): Int = defaultRandom.nextBits(bitCount)
    override fun nextInt(): Int = defaultRandom.nextInt()
    override fun nextInt(until: Int): Int = defaultRandom.nextInt(until)
    override fun nextInt(from: Int, until: Int): Int = defaultRandom.nextInt(from, until)
}

Solution of Random number generate repeating issue in Kotlin

যেহেতু কটলিন একই সীড বারবার ব্যবহারের কারণে সমস্যা হচ্ছে। তাই আমরা stackoverflow এর আরেকটি উত্তর থেকে Random() ক্লাসের কন্সট্রাক্টরে seed হিসাবে current timestamp পাস করলাম।

var randomGenerator = Random(System.currentTimeMillis())
var result = randomGenerator.nextInt(30, 50)

আর যেহেতু আগে nextInt() দিয়ে ঠিকঠাক কাজ করত। তাই নতুন কোডেও nextInt() ব্যবহার করলাম। সীড হিসাবে current timestamp ইউজ করার ফলে প্রতিবার একই সিড ভ্যালু ইউজ হচ্ছে না। ফলে প্রতিবার ভিন্ন ভিন্ন Random number এনশিওর হচ্ছে।

Leave a Reply

Your email address will not be published. Required fields are marked *