Archive

Archive for the ‘توليد دنباله اعداد شبه تصادفي’ Category

چطور كامپيوتر با ساختار كاملا منطقي اش اعداد تصادفي توليد مي كند؟

2008/12/19 14 دیدگاه

اين سوالي بود كه امروز در ذهنم كاملا اتفاقي جرقه زد و به دنبال جواب اون گشتم و نتايجي كه در ادامه خواهيد ديد رو پيدا كردم
اعدادي تصادفي به معني اعدادي است كه غيرقابل پيشبيني و نامعلوم بوده و نظر افراد در توليد آن دخالت نداشته باشد احتمال انتخاب هر عدد با اعداد ديگر برابر باشد از زمان‌های قدیم روش هایی برای تولید این اعداد وجود داشته‌است از جمله پرتاب تاس، پرتاب سکه و برهم زدن کارت‌ها که همچنان در بازی‌ها مورداستفاده قرار می‌گیرند توليد يك عدد كاملا تصادفي تركيبي از علوم كامپيوتر رياضي و فيزيك است و آنچنان كه در ابتدا ساده به نظر مي رسد نيست چرا همون طور كه همه مي دونند كامپيوتر ماشيني است كه با گرفتن ورودي . خروجي معيني رو توليد مي كند حالا اين وسط كامپيوتر مي خواهد يك عدد تصادفي از كجا به ما بده عجيب است
اعداد تصادفي يك مبحث بزرگ و پر كاربرد كامپيوتر است از جمله موارد نياز به اعداد تصادفي موارد زير است
شبيه سازي دنياي واقعي و نادانسته ها كه از كارهاي اصلي كامپيوتر است
رمزگذاري اطلاعات
نمونه برداري تصادفي به جاي سرشماري
تست کارایی برنامه ها وكد ‌های کامپیوتری با ورودي هاي تصادفي
rand
دو روش كلي براي توليد اعداد تصادفي وجود دارد
1- استفاده از يك سخت افزار براي پيگيري تغييرات يك رفتار طبيعي و كاملا تصادفي و ارسال نتايج به كامپيوتر. به عنوان مثال برخی پدیده‌های فیزیکی از جمله واپاشي راديواكتيوي دارای رفتاری کاملاً تصادفی هستند كه با استفاده از اين روش ليستي از اعداد به واقع تصادفي توليد خواهند شد ولي توليد اعداد تصادفي با اين روش به دليل نياز به تجهيزاتي كه تقريبا در هيچ كامپيوتري نصب نيست خيلي به ندرت انجام مي گيرد
2- اعداد شبه تصادفي كه با استفاده از فرمول هاي خاص توليد مي شوند و شباهت زيادي به اعداد تصادفي دارند اين اعداد براي هر فردي كه از فرمول مطلع نباشد كاملا تصادفي جلوه مي كنند البته هر روشي مورد قبول نيست و اعداد توليد شده نبايد به صورت  گردشي تكرار شوند احتمال توليد شدن هر عدد برابر ساير اعداد باشد و همچنين اعداد توليدي قابل پيشبيني نباشند مگر اينكه شما از فرمول و عددي كه به عنوان مقدار آغازين انتخاب شده است اگاه باشيد
تابعي در زبان سي براي توليد اعداد تصادفي


int rand()
{
random_seed = random_seed * 1103515245 +12345;
return (unsigned int)(random_seed / 65536) % 32768;
}

با اين روش هر عدد شبه تصادفي به مقدار آغازين خود بستگي دارد به طوري كه با اجراي يك فرمول با مقدار آغازين ثابت و به دفعات زياد نتايج يكساني به دست خواهد آمد براي توليد اعداد شبه تصادفي كه غير قابل پيشبيني باشند بايد مقدار آغازين يك عدد كاملا تصادفي باشد براي اين مساله در دنياي كامپيوتر معمولا از تاريخ و زمان به عنوان مقدار آغازين استفاده مي شود به اين شكل كه تعداد ثانيه هاي سپري شده از يك تاريخ خاص مثلا اول ژانويه 1970 محاسبه شده و به عنوان يك مقدار اغازين استفاده مي شود تعداد ثاينه هاي سپري شده با هر بار اجراي برنامه و كد متفاوت خواهند بود كه انتخاب خوبي براي تابع توليد اعداد شبه تصادفي مي باشد روش ديگري كه استفاده مي شود كمك گرفتن از كاربر براي انتخاب مقدار آغازين است مثلا برنامه از كاربر مي خواهد تا تعدادي از كليدهاي صفحه كليد را به صورت بي هدف فشار دهد يا اشاره گر ماوس را در صفحه ي نمايش حركت دهد يا كاربر در ميكروفون جمله اي را ادا كند و سپس برنامه ورودي را تركيب كرده و عددي را براي آغاز تابع توليد اعداد تصادفي مي سازد
زماني كه توليد عدد تصادفي مهم باشد مثل رمزگذاري اطلاعات مي توان از تركيب روشها استفاده كرد مثلا استفاده از كاربر زمان سيستم مدل قطعات سخت افزاري سيستم زمان روشن بودن كامپيوتر تاريخ نصب نرم افزارها تعداد بيتهاي استفاده شده از رم و… استفاده كرد

منابعي كه استفاده كردم تو همون يكي دو صفحه اول جستجوي گوگل ليست شده اند منتها منبع اصلي اين بوده

http://computer.howstuffworks.com/question697.htm