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

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


اين سوالي بود كه امروز در ذهنم كاملا اتفاقي جرقه زد و به دنبال جواب اون گشتم و نتايجي كه در ادامه خواهيد ديد رو پيدا كردم
اعدادي تصادفي به معني اعدادي است كه غيرقابل پيشبيني و نامعلوم بوده و نظر افراد در توليد آن دخالت نداشته باشد احتمال انتخاب هر عدد با اعداد ديگر برابر باشد از زمان‌های قدیم روش هایی برای تولید این اعداد وجود داشته‌است از جمله پرتاب تاس، پرتاب سکه و برهم زدن کارت‌ها که همچنان در بازی‌ها مورداستفاده قرار می‌گیرند توليد يك عدد كاملا تصادفي تركيبي از علوم كامپيوتر رياضي و فيزيك است و آنچنان كه در ابتدا ساده به نظر مي رسد نيست چرا همون طور كه همه مي دونند كامپيوتر ماشيني است كه با گرفتن ورودي . خروجي معيني رو توليد مي كند حالا اين وسط كامپيوتر مي خواهد يك عدد تصادفي از كجا به ما بده عجيب است
اعداد تصادفي يك مبحث بزرگ و پر كاربرد كامپيوتر است از جمله موارد نياز به اعداد تصادفي موارد زير است
شبيه سازي دنياي واقعي و نادانسته ها كه از كارهاي اصلي كامپيوتر است
رمزگذاري اطلاعات
نمونه برداري تصادفي به جاي سرشماري
تست کارایی برنامه ها وكد ‌های کامپیوتری با ورودي هاي تصادفي
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

  1. zinati
    2009/10/22 در 08:42

    ba tashakor, vaghean khub bud

  2. asmail
    2009/10/13 در 16:41

    کافی نبود
    کاش بیشتر توضیح میدادید

  3. Asal
    2009/06/10 در 17:52

    بد نبود.

  4. Achillis
    2009/02/16 در 08:13

    این همیشه برای من سوال بود … کلی مرسی

  5. بهنام
    2008/12/30 در 18:57

    با سلام
    البته اینایی که گفتی مربوط به عدد تصادفی یکنواخته
    درصورتیکه ما برای هر تابع توزیع احتمال عدد تصادفی داریم که تولید اعداد تصادفی که از توزیع خاصی پیروی می کنه خودش یک موضوع تحقیقاتیه. مثلا تولید عدد تصادفی که از توزیع وایبول تبعیت می کنه هنوز داره روش کار میشه و مقالاتی تو این زمینه چاپ می شه
    برخی از توزیع های احتمال مثل نرمال بینم نمایی گاما پواسون وایبول رایلی کوشی خی-دو فیشر و …
    معمولا seed یک عدد تصادفی را عدد تصادفی قبلی در نظر می گیرند. یعنی نقطه شروع کننده عدد تصادفی قبلی است.

  6. HOSEINI3SOH
    2008/12/29 در 12:59

    چه جالب اتفاقآ همین روزا بود که نوشتن برنامه اعداد تصادفی رو خوندم.

    تو کتاب برنامه نویسی به زبان ++C نویسنده:دایتل دایتل
    صفحاتشم از 172 تا 181 هست.
    که به تور کامل استفاده از دستور پیش پردازنده time رو توضیح داده.
    کارکردشم به این صورته که تاریخ کامپیوتر و زمان بر حسب ثانیه به صورت عددی متوالی به عنوان داده ی ورودی ماست.

  7. catzisation
    2008/12/27 در 12:06

    خسته نباشي دستت دردنكنه

  8. B_666
    2008/12/22 در 01:29

    در مورد ماشین‌حساب چی؟

  9. امید
    2008/12/20 در 20:20

    خیلی جالب بود. در عین حال مختصر.

  10. reza
    2008/12/20 در 19:34

    خیلی عالی و مفید بود.
    ممنون

  11. 2008/12/20 در 07:58

    جالبه بود
    http://www.sadatsystem.com

  12. 2008/12/20 در 04:51

    توی دات نت برای این کار – اگه نخواهیم از تابع Random استفاده کنیم – می شه با WMI همه اطلاعات کامپیوتر رو خوند و …

  13. amin
    2008/12/20 در 01:51

    عالی بود!

  1. 2009/03/06 در 19:01

بیان دیدگاه