সমস্যাটি হ'ল সংযোজন। rand()
এর int
মান প্রদান করে 0...RAND_MAX
। সুতরাং, আপনি যদি তাদের মধ্যে দুটি যোগ করেন তবে আপনি উঠতে পারবেন RAND_MAX * 2
। যদি এটি অতিক্রম করে INT_MAX
তবে সংযোজনের ফলাফলটি যে বৈধ পরিধিটিকে int
ধরে রাখতে পারে তা উপচে পড়ে । স্বাক্ষরিত মানগুলির ওভারফ্লো অপরিজ্ঞাত আচরণ এবং এটি আপনার কীবোর্ডকে বিদেশী ভাষায় কথা বলার দিকে পরিচালিত করে।
যেহেতু এখানে দুটি এলোমেলো ফলাফল যুক্ত করার কোনও লাভ নেই, সহজ ধারণাটি এটি না করা। বিকল্প হিসাবে আপনি প্রতিটি ফলাফল unsigned int
সংযোজনের আগে কাস্ট করতে পারেন যদি এতে যোগফল থাকে। অথবা আরও বড় ধরণের ব্যবহার করুন। নোটটি যে এর long
চেয়ে বৃহত্তর নয় int
, ন্যূনতম b৪ বিট long long
হলে একই ক্ষেত্রে প্রযোজ্য int
!
উপসংহার: কেবল সংযোজন এড়ানো। এটি আরও "এলোমেলোতা" সরবরাহ করে না। আপনার যদি আরও বিটগুলির প্রয়োজন হয় তবে আপনি মানগুলি একত্রিত করতে পারেন sum = a + b * (RAND_MAX + 1)
তবে এর জন্য সম্ভবত এর চেয়ে আরও বড় ডেটা ধরণের প্রয়োজনint
।
যেমনটি আপনার নির্ধারিত কারণটি শূন্য-ফলাফল এড়ানো হয়: এটি দুটি rand()
কলের ফলাফল যুক্ত করে এড়ানো যায় না , কারণ উভয়ই শূন্য হতে পারে। পরিবর্তে, আপনি কেবল বৃদ্ধি করতে পারেন। যদি RAND_MAX == INT_MAX
, এটি করা যায় না int
। তবে, (unsigned int)rand() + 1
খুব, খুব সম্ভবত করতে হবে। সম্ভবত (নিশ্চিতভাবে নয়), কারণ এটির প্রয়োজন নেই UINT_MAX > INT_MAX
, যা আমি বাস্তবায়িত (যা বেশ কয়েকটি এমবেডেড আর্কিটেকচার, ডিএসপি এবং বিগত 30 বছরের সমস্ত ডেস্কটপ, মোবাইল এবং সার্ভার প্ল্যাটফর্মগুলি কভার করে) সম্পর্কে অবহিত সমস্ত বাস্তবায়নের ক্ষেত্রে সত্য।
সতর্কতা:
ইতিমধ্যে এখানে মন্তব্য সিঁচিত যদিও, নোট যে দুটি র্যান্ডম মান যোগ দয়া করে নেই না একটি অভিন্ন বন্টন, কিন্তু দুই পাশা ঘূর্ণায়মান মত একটি ত্রিকোণ বন্টন: পেতে 12
(দুই পাশা) উভয় পাশা দেখাতে হবে 6
। কারণ 11
ইতিমধ্যে দুটি সম্ভাব্য রূপ রয়েছে: 6 + 5
বা5 + 6
, ইত্যাদি
সুতরাং, সংযোজনটিও এই দিক থেকে খারাপ।
এছাড়াও মনে রাখবেন যে ফলাফলগুলি rand()
উত্পন্ন হয় একে অপরের থেকে স্বতন্ত্র নয়, কারণ সেগুলি সিউডোরেন্ডম সংখ্যার জেনারেটর দ্বারা তৈরি করা হয়েছিল । এছাড়াও নোট করুন মানক গণনা করা মানগুলির গুণমান বা অভিন্ন বিতরণ নির্দিষ্ট করে না।
rand()
নেতিবাচক হতে পারে না ...