কেন র‌্যাণ্ড () + র‌্যান্ড () নেতিবাচক সংখ্যা উত্পাদন করে?


304

আমি rand()লাইব্রেরির ফাংশনটি পর্যবেক্ষণ করেছি যখন এটি একবার লুপের মধ্যে একবার বলা হয়, এটি প্রায় সর্বদা ইতিবাচক সংখ্যা তৈরি করে produces

for (i = 0; i < 100; i++) {
    printf("%d\n", rand());
}

তবে আমি যখন দুটি rand()কল যুক্ত করব তখন উত্পন্ন নম্বরগুলিতে আরও নেতিবাচক সংখ্যা রয়েছে।

for (i = 0; i < 100; i++) {
    printf("%d = %d\n", rand(), (rand() + rand()));
}

কেউ ব্যাখ্যা করতে পারেন কেন আমি দ্বিতীয় মামলায় নেতিবাচক সংখ্যা দেখছি?

PS: আমি লুপ হিসাবে আগে বীজ আরম্ভ srand(time(NULL))


11
rand()নেতিবাচক হতে পারে না ...
twentylemon

293
র্যান্ড () + র্যান্ড () ওভারফ্লো করতে পারে
মাসকাচোভনিক

13
RAND_MAXআপনার সংকলক জন্য কি ? আপনি সাধারণত এটি খুঁজে পেতে পারেন stdlib.h। (মজার: চেক করা man 3 rand, এটি এক-লাইনের বর্ণনা "খারাপ র্যান্ডম নম্বর জেনারেটর" বহন করে))
usr2564301

6
প্রতিটি বুদ্ধিমান প্রোগ্রামার যা করবে তা করুন abs(rand()+rand())। আমি বরং নেতিবাচক চেয়ে একটি ইতিবাচক ইউবি চাই! ;)
ভিনিস কামাকুরা

11
@ হেক্সা: এটি ইউবির পক্ষে কোনও উদ্বেগ নয়, কারণ ইতিমধ্যে সংযোজনের জন্য এটি ঘটে। আপনি ইউবিকে সংজ্ঞায়িত আচরণে পরিণত করতে পারবেন না । একটি বুদ্ধিমান অগ্রগতিবিদ নরকের মতো ইউবি এড়াতে পারে।
এই সাইটের জন্য খুব সৎ

উত্তর:


542

rand()0এবং এর মধ্যে একটি পূর্ণসংখ্যা ফেরত সংজ্ঞায়িত করা হয় RAND_MAX

rand() + rand()

উপচে পড়তে পারে আপনি যা পর্যবেক্ষণ করছেন এটি পূর্ণ সংখ্যার ওভারফ্লো দ্বারা সৃষ্ট অপরিজ্ঞাত আচরণের ফলাফল ।


4
@ জাকুব আর্নল্ড: কীভাবে ওভারফ্লো আচরণ প্রতিটি ভাষার দ্বারা আলাদাভাবে নির্দিষ্ট করা যায়? উদাহরণস্বরূপ পাইথনের কোনও কিছুই নেই (ভাল, উপলব্ধ মেমরি অবধি) যেমন কেবল প্রসারিত হয়।
এই সাইটের জন্য খুব সৎ

2
@ ওলাফ এটি নির্ভর করে যে কোনও ভাষা কীভাবে স্বাক্ষরিত পূর্ণসংখ্যার প্রতিনিধিত্ব করার সিদ্ধান্ত নেয়। জাভাতে পূর্ণসংখ্যার ওভারফ্লো সনাক্ত করার কোনও ব্যবস্থা ছিল না (জাভা 8 অবধি) এবং এটি চারপাশে মোড়কের জন্য সংজ্ঞায়িত করা হয়েছে এবং গো 2 এর পরিপূরক উপস্থাপনাটি কেবলমাত্র ব্যবহার করে এবং স্বাক্ষরিত পূর্ণসংখ্যার ওভারফ্লোগুলির জন্য এটি আইনি সংজ্ঞা দেয়। সি অবশ্যই 2 এর বেশি পরিপূরককে সমর্থন করে।
পিপি

2
@ ইভান কার্লস্কে না, এটি সর্বজনীন আচরণ নয়। আপনি যা বলছেন তা 2 এর পরিপূরক উপস্থাপনা is তবে সি ভাষা অন্যান্য উপস্থাপনার জন্যও অনুমতি দেয়। সি ভাষার স্পেসিফিকেশন বলছে স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো অপরিজ্ঞাত । সুতরাং সাধারণভাবে, কোনও প্রোগ্রামের এই জাতীয় আচরণের উপর নির্ভর করা উচিত নয় এবং স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো না হওয়ার জন্য সতর্কতার সাথে কোডের প্রয়োজন। তবে স্বাক্ষরবিহীন পূর্ণসংখ্যার ক্ষেত্রে এটি প্রযোজ্য নয় কারণ তারা একটি সু-সংজ্ঞায়িত (হ্রাস মডুলো 2) পদ্ধতিতে "মোড়কে" থাকবেন। [অব্যাহত] ...
পিপি

12
এটি স্বাক্ষরিত পূর্ণসংখ্যার ওভারফ্লো সম্পর্কিত সি স্ট্যান্ডার্ডের উদ্ধৃতি: যদি কোনও অভিব্যক্তি মূল্যায়নের সময় কোনও ব্যতিক্রমী পরিস্থিতি দেখা দেয় (এটি যদি ফলাফলটি গাণিতিকভাবে সংজ্ঞায়িত না হয় বা তার ধরণের জন্য উপস্থাপনামূলক মানগুলির পরিসীমাতে না হয়), আচরণ অনির্ধারিত.
পিপি

3
সিভিলাররা স্ট্যান্ডার্ডটি ব্যবহার করেন এবং স্বাক্ষরিত পূর্ণসংখ্যার জন্য তারা প্রশ্নটি থেকে কিছুটা দূরে চলে গেছে ইভান কার্লসলেক তারা ধরে নিতে পারে যে a + b > aতারা যদি তা জানে তবে b > 0। তারা ধরেও নিতে পারে যে পরে যদি মৃত্যুদন্ড কার্যকর করা বিবৃতি হয় a + 5তবে বর্তমান মান তখন কম হবে INT_MAX - 5। এমনকি ট্র্যাপস প্রোগ্রাম ব্যতীত 2 এর পরিপূরক প্রসেসর / দোভাষীর উপর এমন আচরণ নাও করতে পারে যেন intফাঁদ ছাড়াই 2 এর পরিপূরক।
ম্যাকিয়েজ পাইচোটকা

90

সমস্যাটি হ'ল সংযোজন। 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()উত্পন্ন হয় একে অপরের থেকে স্বতন্ত্র নয়, কারণ সেগুলি সিউডোরেন্ডম সংখ্যার জেনারেটর দ্বারা তৈরি করা হয়েছিল । এছাড়াও নোট করুন মানক গণনা করা মানগুলির গুণমান বা অভিন্ন বিতরণ নির্দিষ্ট করে না।


14
@ বাবমাদ: সুতরাং যদি উভয় কলই 0 ফেরত দেয়?
এই সাইটের জন্য খুব সৎ

3
@ বাবমাদ: আমি কেবল আশ্চর্য হই UINT_MAX > INT_MAX != falseযে মানক দ্বারা গ্যারান্টিযুক্ত কিনা । (সম্ভবত মনে হচ্ছে, তবে প্রয়োজন কিনা তা নিশ্চিত নয়)। যদি তা হয় তবে আপনি কেবলমাত্র একক ফলাফল এবং বর্ধন (order ক্রমে!) কাস্ট করতে পারেন।
এই সাইটের জন্য খুব সৎ

3
আপনি অ-ইউনিফর্ম বিতরণ করতে চাইলে একাধিক এলোমেলো সংখ্যা যুক্ত করার সুবিধা রয়েছে: স্ট্যাকওভারফ্লো.com
প্রশ্নস

6
0 এড়াতে, সরল "যখন ফলাফল 0 হয়, পুনরায় রোল"?
অলিভিয়ার ডুলাক

2
কেবল এগুলি 0 এড়ানোর জন্য একটি খারাপ উপায়ে যোগ করা নয়, এটির অ-ইউনিফর্ম বিতরণও ফলাফল। আপনি রোলিং ডাইসের ফলাফলের মতো বিতরণ পান: 2 বা 12 হিসাবে 7 বার 6 বার সম্ভবত
বারমার

36

এটি এই উত্তরের মন্তব্যে করা প্রশ্নের স্পষ্টির জবাব ,

আমি যুক্ত করার কারণটি ছিল আমার কোডের এলোমেলো সংখ্যা হিসাবে '0' এড়ানো। র্যান্ড () + র্যান্ড () হ'ল দ্রুত নোংরা সমাধান যা সহজেই আমার মনে আসে।

সমস্যাটি ছিল 0 এড়ানোর জন্য প্রস্তাবিত সমাধানের সাথে কমপক্ষে দুটি সমস্যা রয়েছে are একটি হ'ল, অন্যান্য উত্তরগুলি সূচিত করে, এটিrand()+rand() অপরিজ্ঞাত আচরণের জন্য প্রার্থনা করতে পারে। সর্বোত্তম পরামর্শ হ'ল অনির্ধারিত আচরণটি কখনই না চালানো। আর একটি বিষয় এর কোনও গ্যারান্টি নেইrand() পরপর দুবার 0 উত্পাদন করে না।

নিম্নলিখিতটি শূন্যকে প্রত্যাখ্যান করে, সংজ্ঞায়িত আচরণ এড়িয়ে চলে এবং বেশিরভাগ ক্ষেত্রে ক্ষেত্রে দুটি কল থেকে দ্রুততর হবে rand():

int rnum;
for (rnum = rand(); rnum == 0; rnum = rand()) {}
// or do rnum = rand(); while (rnum == 0);

9
কি হবে rand() + 1?
জিজ্ঞাসাবাদক

3
@ আসকভিক্টর এটি উপচে পড়তে পারে (যদিও এটি অসম্ভব)।
অঙ্কিত

3
@gerrit - MAX_INT এবং RAND_MAX- এর উপর নির্ভর করে
জিজ্ঞাসাবাদক

3
@ জিরিট, তারা যদি একই না হয় তবে আমি অবাক হব , তবে আমি মনে করি এটি
পেডেন্টদের

10
যদি RAND_MAX == MAX_INT, র‌্যান্ড () + 1 র্যান্ড () এর মান 0 হওয়ার সমান সম্ভাবনার সাথে উপচে পড়বে যা এই সমাধানটিকে সম্পূর্ণ অর্থহীন করে তোলে। আপনি যদি এটি ঝুঁকি নিতে এবং ওভারফ্লো হওয়ার সম্ভাবনা উপেক্ষা করতে ইচ্ছুক হন তবে আপনি পাশাপাশি র্যান্ড () ব্যবহার করতে পারেন এবং এটির 0 ফেরার সম্ভাবনাটি উপেক্ষা করতে পারেন
এমিল জ্যাবেক

3

মূলত rand()মধ্যে সংখ্যার উত্পাদন 0এবং RAND_MAX, এবং 2 RAND_MAX > INT_MAXআপনার ক্ষেত্রে।

অতিরিক্ত প্রবাহ রোধ করতে আপনি আপনার ডেটা-টাইপের সর্বাধিক মান সহ মডুলাস করতে পারেন। এই অবশ্যইটি এলোমেলো সংখ্যার বিতরণকে ব্যাহত করবে, তবে randদ্রুত এলোমেলো সংখ্যা পাওয়ার একমাত্র উপায়।

#include <stdio.h>
#include <limits.h>

int main(void)
{
    int i=0;

    for (i=0; i<100; i++)
        printf(" %d : %d \n", rand(), ((rand() % (INT_MAX/2))+(rand() % (INT_MAX/2))));

    for (i=0; i<100; i++)
        printf(" %d : %ld \n", rand(), ((rand() % (LONG_MAX/2))+(rand() % (LONG_MAX/2))));

    return 0;
}

2

আপনি সম্ভবত একটি কৌশল অবলম্বন করে এই বিষয়টি নিশ্চিত করে দেখতে পারেন যে 2 র‌্যান্ডের যোগফল () কখনই RAND_MAX এর মান অতিক্রম করে না। একটি সম্ভাব্য পদ্ধতির যোগফল = র্যান্ড () / 2 + র্যান্ড () / 2 হতে পারে; এটি নিশ্চিত করবে যে RA বিম্যাক্সের সাথে 167 বিটের সংকলনের জন্য 32767 এর মান দুটি এমনকি র্যান্ড 32767 ফিরে আসে, তবুও (32767/2 = 16383) 16383 + 16383 = 32766, ফলস্বরূপ নেতিবাচক যোগফল হবে না।


1
ওপি ফলাফল থেকে 0 বাদ দিতে চেয়েছিল। সংযোজন এলোমেলো মানগুলির অভিন্ন বিতরণও সরবরাহ করে না।
এই সাইটের জন্য খুব সৎ

@ ওলাফ: এমন কোনও গ্যারান্টি নেই যে টানা দুটি কল rand()উভয়ই শূন্যের ফল দেয় না, তাই শূন্য এড়ানোর আকাঙ্ক্ষা দুটি মান যুক্ত করার উপযুক্ত কারণ নয়। অন্যদিকে, অ-ইউনিফর্ম বিতরণ করার আকাঙ্ক্ষা দুটি এলোমেলো মান যুক্ত করার একটি ভাল কারণ হ'ল যদি কেউ নিশ্চিত করে যে ওভারফ্লো ঘটে না।
সুপারক্যাট

1

আমি যুক্ত করার কারণটি ছিল আমার কোডের এলোমেলো সংখ্যা হিসাবে '0' এড়ানো। র্যান্ড () + র্যান্ড () হ'ল দ্রুত নোংরা সমাধান যা সহজেই আমার মনে আসে।

একটি সহজ সমাধান (ঠিক আছে, এটিকে "হ্যাক" বলুন) যা কখনই শূন্য ফলাফল দেয় না এবং কখনই উপচে পড়বে না:

x=(rand()/2)+1    // using divide  -or-
x=(rand()>>1)+1   // using shift which may be faster
                  // compiler optimization may use shift in both cases

এটি আপনার সর্বাধিক মানকে সীমাবদ্ধ করবে, তবে আপনি যদি সেটির বিষয়ে চিন্তা করেন না তবে এটি আপনার পক্ষে ভাল কাজ করা উচিত।


1
সিডনোট: স্বাক্ষরিত ভেরিয়েবলগুলির ডান শিফট সহ সাবধানতা অবলম্বন করুন। এটি শুধুমাত্র অ-নেগেটিভ মানগুলির জন্য সুনির্দিষ্টভাবে সংজ্ঞায়িত, নেতিবাচকদের জন্য এটি বাস্তবায়ন সংজ্ঞায়িত। (ভাগ্যক্রমে, rand()সর্বদা একটি nonnegative মান প্রদান করে)। যাইহোক, আমি অপটিমাইজেশনটি এখানে সংকলকটিতে রেখে দেব।
এই সাইটের জন্য খুব সৎ

@ ওলাফ: সাধারণভাবে দু'জনের দ্বারা স্বাক্ষরিত বিভাজন শিফটের চেয়ে কম দক্ষ হবে। সংকলক লেখক যদি সংকলকটিকে randঅ-নেতিবাচক বলে বলার জন্য প্রচেষ্টা না করে থাকে তবে স্বাক্ষরিত পূর্ণসংখ্যার দ্বারা বিভাজনের চেয়ে শিফটটি আরও কার্যকর হবে 2. বিভাগ দ্বারা 2uকাজ করা যেতে পারে, তবে যদি xএটি intস্বাক্ষরযুক্ত থেকে নিখুঁত রূপান্তর সম্পর্কে সতর্কবার্তা হতে পারে স্বাক্ষরিত।
সুপারক্যাট

@ সুপের্যাট: দয়া করে আমার মন্তব্য car3efully আবার পড়ুন। আপনার খুব ভালভাবে জানা উচিত যে কোনও যুক্তিসঙ্গত সংকলক যে / 2কোনওভাবেই একটি শিফট ব্যবহার করবে (আমি এটিকে এমন -O0কিছুর জন্য দেখেছি , অর্থাত্ স্পষ্টভাবে অনুরোধ না করে)। এটি সম্ভবত সি কোডের সবচেয়ে তুচ্ছ এবং সর্বাধিক প্রতিষ্ঠিত অপ্টিমাইজেশন। পয়েন্ট হ'ল বিভাগটি পুরো সংখ্যার পরিসরের জন্য মান দ্বারা সংজ্ঞায়িত হয়, কেবল অ-নেতিবাচক মান নয়। আবার: সংকলকটিতে অপটিকেশনগুলি ছেড়ে দিন, প্রথমে সঠিক এবং স্পষ্ট কোড লিখুন । এটি নতুনদের জন্য আরও গুরুত্বপূর্ণ।
খুব সহজে এই সাইটের জন্য

@Olaf: প্রত্যেক কম্পাইলার আমি পরীক্ষিত থাকেন যখন নাড়াচাড়া আরও দক্ষ কোড জেনারেট করে rand()একের পর ডান বা বিভাজক 2uযখন 2 দ্বারা ভাগ চেয়ে, এমনকি যখন ব্যবহার -O3। কেউ যুক্তিযুক্তভাবে বলতে পারে যে এই ধরনের অপ্টিমাইজেশনের বিষয়টি বিবেচনার সম্ভাবনা নেই, তবে "এই ধরণের অপ্টিমাইজেশানগুলি সংকলককে ছেড়ে দিন" বললে বোঝা যায় যে সংকলকরা তাদের সম্পাদন করার সম্ভাবনা রাখে। আপনি কি এমন কোনও সংকলক জানেন যা আসলে করবে?
সুপারক্যাট

@ সুপের্যাট: আপনার তখন আরও আধুনিক সংকলক ব্যবহার করা উচিত। শেষবার যখন আমি উত্পন্ন এসেমব্লারটি যাচাই করেছিলাম তখন সিসিটি জিসি ঠিক সূক্ষ্ম কোড উত্পন্ন করেছিল। তা সত্ত্বেও, আমি গ্রুপি পেতে যতটুকু সন্দেহ করি, আপনি শেষবারের মতো যে পরিমাণ প্রসার উপস্থাপন করেছেন তা বাড়ানো হবে না prefer এই পোস্টগুলি বছরের পুরানো, আমার মন্তব্য পুরোপুরি বৈধ। ধন্যবাদ.
খুব সহজে এই সাইটের জন্য

1

0 এড়ানোর জন্য, এটি চেষ্টা করুন:

int rnumb = rand()%(INT_MAX-1)+1;

আপনাকে অন্তর্ভুক্ত করা দরকার limits.h


4
এটি 1 পাওয়ার সম্ভাবনা দ্বিগুণ করবে এটি মূলত একই (তবে সম্ভবত ধীর) শর্তাধীন 1 যোগ করলে rand()0 ফলন হয়
এই সাইটের পক্ষে খুব সৎ

হ্যাঁ, আপনি ঠিক বলেছেন। RAND () = 0 বা যদি INT_MAX করেছেন -1 rnumb 1. হতে হবে
Doni

আরও খারাপ, আমি এটি সম্পর্কে চিন্তা করতে আসা হিসাবে। এটি প্রকৃতপক্ষে 1এবং 2(সমস্ত অনুমিত RAND_MAX == INT_MAX) এর সম্ভাব্যতা দ্বিগুণ করবে । আমি ভুলে গিয়েছিলাম - 1
এই সাইটের জন্য খুব সৎ

1
-1এখানে কোনো মূল্যই স্থল। rand()%INT_MAX+1; এখনও [1 ... INT_MAX] ব্যাপ্তিতে মান তৈরি করতে পারে values
chux - মনিকা পুনরায় ইনস্টল করুন

-2

সম্ভাব্য ওভারফ্লো সম্পর্কে অন্যরা যা বলেছেন তা নেতিবাচক কারণ হতে পারে, এমনকি আপনি স্বাক্ষরবিহীন পূর্ণসংখ্যা ব্যবহার করলেও। আসল সমস্যাটি আসলে সময় / তারিখের কার্যকারিতা বীজ হিসাবে ব্যবহার করা। আপনি যদি এই কার্যকারিতাটির সাথে সত্যই পরিচিত হয়ে থাকেন তবে আমি কেন এটি বলছি তা আপনি ঠিক বুঝতে পারবেন। এটি আসলে যা করে তা হ'ল একটি নির্দিষ্ট সময় / সময় থেকে একটি দূরত্ব (অতিবাহিত সময়) দেওয়া। যদিও তারিখ / সময় কার্যকারিতা বীজ হিসাবে একটি র‌্যান্ড () হিসাবে ব্যবহার করা একটি খুব সাধারণ অনুশীলন, এটি সত্যিই সেরা বিকল্প নয়। আপনার আরও ভাল বিকল্পগুলি অনুসন্ধান করা উচিত, কারণ এই বিষয়টিতে অনেক তত্ত্ব রয়েছে এবং আমি সম্ভবত সেগুলি সবগুলিতে যেতে পারিনি। আপনি এই সমীকরণটিতে অতিরিক্ত প্রবাহের সম্ভাবনা যুক্ত করেন এবং এই পদ্ধতির শুরু থেকেই ধ্বংস হয়ে যায়।

যাঁরা র‌্যান্ড () + 1 পোস্ট করেছেন তারা সমাধানটি ব্যবহার করছেন যা সর্বাধিক ব্যবহার করা হয় যাতে তারা নেতিবাচক নম্বর না পায় তার গ্যারান্টি দেয়। তবে, সেই পদ্ধতির পক্ষে সত্যিই সবচেয়ে ভাল উপায় নয়।

আপনি যে সর্বোত্তম কাজটি করতে পারেন তা হ'ল যথাযথ ব্যতিক্রম হ্যান্ডলিং লিখতে এবং ব্যবহার করতে অতিরিক্ত সময় নেওয়া এবং এবং / অথবা আপনি যখন শূন্য ফলাফল নিয়ে এসে পৌঁছান শুধুমাত্র র্যান্ড () সংখ্যায় যোগ করুন। এবং, নেতিবাচক সংখ্যাগুলি সঠিকভাবে মোকাবেলা করতে। র‌্যান্ড () কার্যকারিতা নিখুঁত নয় এবং তাই আপনার পছন্দসই ফলাফলটি শেষ হয়েছে তা নিশ্চিত করতে ব্যতিক্রম হ্যান্ডলিংয়ের সাথে একত্রে ব্যবহার করা প্রয়োজন।

তদন্ত, অধ্যয়ন, এবং সঠিকভাবে র্যান্ড () কার্যকারিতা বাস্তবায়নের জন্য অতিরিক্ত সময় এবং প্রচেষ্টা গ্রহণ করা সময় এবং প্রচেষ্টার পক্ষে যথেষ্ট। শুধু আমার দুই সেন্ট। আপনার চেস্টার জন্য সৌভাগ্য কামনা করছি...


2
rand()কোন বীজ ব্যবহার করবেন তা নির্দিষ্ট করে না। মান করে একটি সিউডোরান্ডম জেনারেটর, না কোনো সময় একটি সম্পর্ক ব্যবহার করার জন্য এটি উল্লেখ করুন। এটি জেনারেটরের গুণমান সম্পর্কেও উল্লেখ করে না। প্রকৃত সমস্যাটি স্পষ্টভাবে ওভারফ্লো। নোট যা rand()+1এড়ানোর জন্য ব্যবহৃত হয় 0; rand()একটি নেতিবাচক মান প্রদান করে না। দুঃখিত, তবে আপনি এখানে বিন্দু মিস করেছেন। এটি পিআরএনজির মান সম্পর্কে নয়। ...
এই সাইটের পক্ষে খুব সৎ

... জিএনইউ / লিনাক্স এর বীজ থেকে বীজ থেকে ভাল অনুশীলন করুন /dev/randomএবং পরে একটি ভাল পিআরএনজি ব্যবহার করুন (গ্লাবসি rand()থেকে গুণমান সম্পর্কে নিশ্চিত নয় ) বা ডিভাইসটি ব্যবহার চালিয়ে যান - যদি পর্যাপ্ত এনট্রপি না পাওয়া যায় তবে আপনার অ্যাপ্লিকেশনটিকে ব্লক করতে ঝুঁকিপূর্ণ। অ্যাপ্লিকেশনটিতে আপনার এনট্রপি পাওয়ার চেষ্টা করা খুব সম্ভবত একটি দুর্বলতা হতে পারে কারণ সম্ভবত আক্রমণ করা সহজ। এবং এখন এটি কঠোর হয়ে আসে - এখানে নয়
এই সাইটের পক্ষে খুব সৎ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.