معادله لورنز سرآغاز عصر جدیدی در درک سیستم های پیچیده و غیر خطی بود. عصری که پنداشت ساعت وار جهان را بیش از پیش به رویا بدل می کرد. در قسمت های بعدی به عمق کار لورنز و اثری که کار او در فهم سیستم های پیچیده کنونی داشت می پردازیم.
@MatlabTips
#For_intermediate, #For_Advanced
#Dynamic_Systems, #Chaos_Theory, #Dependence_on_Initial_Conditions, #Butterfly_Effect
نویسنده:(#A_2)
@MatlabTips
#For_intermediate, #For_Advanced
#Dynamic_Systems, #Chaos_Theory, #Dependence_on_Initial_Conditions, #Butterfly_Effect
نویسنده:(#A_2)
🔵رسم نمودار با plotly🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیشنیاز:(کد نویسی پایه)
برای:همه
در مورد رسم نمودارهای مختلف با متلب مطالب زیادی وجود دارد و رسم یک نمودار زیبا علاوه بر دانش نیاز به قدری سلیقه و هنر هم دارد. بسیاری از شما حتما با پکیج های نرم افزاری دیگری مانند پایتون و آر هم آشنایی دارید یا حداقل اسمی از آن ها شنیده اید. این پکیج ها هم روش های خاص خود را برای رسم نمودار دارند. اما ممکن است برای شما هم پیش آمده باشد که بخواهید نمودار خود را به همان صورت تعاملی ( یعنی با چرخاندن و زوم کردن و غیره) و نه به صورت یک عکس به کامپیوتر دیگری منتقل کنید بدون آنکه نیاز باشد تمامی نرم افزار متلب را بر روی آن نصب کنید! متاسفانه خاصیت انحصاری نرم افزار متلب مانع از این کار می شود. اما توسعه ابزارهای رسم وب در چندین سال اخیر به حدی رسیده است که حتی قدرت بیشتری از ابزارهای تخصصی به ما می دهند. این ابزار ها مبتنی بر زبان جاوااسکریپت بوده و قابل اجرا توسط مرورگرهای مختلف می باشند.
ابزار plotly یک ابزار مبتنی بر وب(به صورت آفلاین و آنلاین) برای رسم نمودارهاست که قابلیت اتصال به متلب، پایتون و آر را دارد. در این قسمت به نحوه راه اندازی و استفاده از آن که بسیار ساده است می پردازیم.
1- ابتدا فایل MATLAB-api-master را دانلود کرده( 200KB) و آن را اکسترکت کنید و در جایی مانند ریشه درایو C (یا هر جای دیگری) قرار دهید.
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیشنیاز:(کد نویسی پایه)
برای:همه
در مورد رسم نمودارهای مختلف با متلب مطالب زیادی وجود دارد و رسم یک نمودار زیبا علاوه بر دانش نیاز به قدری سلیقه و هنر هم دارد. بسیاری از شما حتما با پکیج های نرم افزاری دیگری مانند پایتون و آر هم آشنایی دارید یا حداقل اسمی از آن ها شنیده اید. این پکیج ها هم روش های خاص خود را برای رسم نمودار دارند. اما ممکن است برای شما هم پیش آمده باشد که بخواهید نمودار خود را به همان صورت تعاملی ( یعنی با چرخاندن و زوم کردن و غیره) و نه به صورت یک عکس به کامپیوتر دیگری منتقل کنید بدون آنکه نیاز باشد تمامی نرم افزار متلب را بر روی آن نصب کنید! متاسفانه خاصیت انحصاری نرم افزار متلب مانع از این کار می شود. اما توسعه ابزارهای رسم وب در چندین سال اخیر به حدی رسیده است که حتی قدرت بیشتری از ابزارهای تخصصی به ما می دهند. این ابزار ها مبتنی بر زبان جاوااسکریپت بوده و قابل اجرا توسط مرورگرهای مختلف می باشند.
ابزار plotly یک ابزار مبتنی بر وب(به صورت آفلاین و آنلاین) برای رسم نمودارهاست که قابلیت اتصال به متلب، پایتون و آر را دارد. در این قسمت به نحوه راه اندازی و استفاده از آن که بسیار ساده است می پردازیم.
1- ابتدا فایل MATLAB-api-master را دانلود کرده( 200KB) و آن را اکسترکت کنید و در جایی مانند ریشه درایو C (یا هر جای دیگری) قرار دهید.
2- نرم افزار متلب را باز کنید و Set path را بزنید. این گزینه درنسخه های جدید متلب به صورت شکل زیر است و در نسخه های قدیمی تر به صورت File>Set Path می باشد.
3- در پنجره باز شده Add with subfolders را زده و پوشه MATLAB-api-master را انتخاب کنید. و در نهایت تکمه save را بزنید.
4- دستور getplotlyoffline('https://cdn.plot.ly/plotly-latest.min.js') را در خط فرمان بزنید و چند لحظه منتظر شوید تا پیام موفقیت داده شود.(برای این مرحله حتمن نیاز است که متصل به اینترنت باشید)
حالا شما می توانید برای هر نموداری که میکشید یک نسخه قابل حمل به سایر کامپیوتر ها هم داشته باشید. فقط کافی است که یک خط دستور پس از رسم عادی متلب قرار دهید. به نمونه زیر توجه کنید:
پس از اجرای کد بالا ابتدا متلب یک نمودار رسم می کند سپس متلب مرورگر پیش فرض سیستمتان را باز می کند و نمودار plotly را هم نشان می دهد.
همانطور که می بینید تنها یک خط(خط آخر) باید اضافه کنید(همیشه مستقل از نوع رسم همین یک خط کافی است!). تنها باید توجه کنید که فایل خروجی به صورت یک فایل html است که با اسم بعد از filename (در مثال بالا sine) کنار کد هایتان قرار می گیرد. من آن را در زیر قرار داده ام که دانلود کنید و خود ببینید.
4- دستور getplotlyoffline('https://cdn.plot.ly/plotly-latest.min.js') را در خط فرمان بزنید و چند لحظه منتظر شوید تا پیام موفقیت داده شود.(برای این مرحله حتمن نیاز است که متصل به اینترنت باشید)
حالا شما می توانید برای هر نموداری که میکشید یک نسخه قابل حمل به سایر کامپیوتر ها هم داشته باشید. فقط کافی است که یک خط دستور پس از رسم عادی متلب قرار دهید. به نمونه زیر توجه کنید:
[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
surf(Z);
fig2plotly(gcf, 'offline', true, 'filename', 'sine');
پس از اجرای کد بالا ابتدا متلب یک نمودار رسم می کند سپس متلب مرورگر پیش فرض سیستمتان را باز می کند و نمودار plotly را هم نشان می دهد.
همانطور که می بینید تنها یک خط(خط آخر) باید اضافه کنید(همیشه مستقل از نوع رسم همین یک خط کافی است!). تنها باید توجه کنید که فایل خروجی به صورت یک فایل html است که با اسم بعد از filename (در مثال بالا sine) کنار کد هایتان قرار می گیرد. من آن را در زیر قرار داده ام که دانلود کنید و خود ببینید.
نمودار های plotly به حدی زیبا هستند که شاید شما هم مانند من به رسم خود متلب ترجیحشان بدهید. فراموش نکنید که این نمودار ها قابل جابجا کردن روی بقیه platform ها را دارند. در قسمت های بعدی چند نمودار دیگر هم با این ابزار رسم می کنیم.
@MatlabTips
#For_beginner ,
#For_intermediate, #For_Advanced
#Plotly #Plot #Portability
نویسنده:(#A_2)
@MatlabTips
#For_beginner ,
#For_intermediate, #For_Advanced
#Plotly #Plot #Portability
نویسنده:(#A_2)
🔵درست مثل یک حرفه ای🔵
برای: همه
پیش نیاز: (خواندن و نوشتن متون فارسی مدرن)
سطح پیچیدگی:🌑🌑🌑🌑🌑
تمام دانشجوهایی که به نوعی کارشون گیر متلب هست با احتمال خوبی کارشون گیر یک موضوعی هست که باید شبیه سازی بشه (simulated to be). این وسط یا باید یک ام فایل بنویسید یا با سیمیولینک و یا با gui (که معمولا مربوط به یک تولباکس خاصی) میشه باید کار کنید.
اما ما چطور برنامه مینویسیم؟؟(this is a big deal!)
در لپ تاپ و باز میکنیم یه یا علی میگیم و متلب و آتیش میکنیم و مثلا ادیتور رو باز میکنیم و اول برنامه هم مثل مرد یه
می نویسیم که مثلا ما هم اره. یه ذره فک به پروژه فک میکنیم و تو گوشه ذهنمون تبدیل به کدش میکنیم میاریم رو صفحه ادیتور متلب. میریم جلو و به هر زور هست برنامه تموم میشه. ولی مطمئن باشید این برنامه ای نیست که بتونید بهش افتخارکنید. برنامه ای که احتمالا کامنت نداره، احتمالا به لحاظ سرعت اجرا نه تنها بهینه نیست بلکه افتضاست، احتمالا تو یه حالات خاصی جواب میده، احتمالا اسم یکی از متغیراتون a اسم یکی دیگش aa و اسم سومی aaa و تا آخر و احتمالا ...
سعی کنید قبل از اینکه شروع کنید به نوشتن یک برنامه ابتدا فلوچارت برنامه رو بکشید، بعد شبه کد آن رو بر روی کاغذ پیاده کنید و سپس "درست مثل یک حرفه ای" با اعتماد به نفس شروع میکنید به کد نوشتن.
طرح یک مشکل:
میخام نمودار sin(x)/x رو رسم کنم ولی تو نقطه X=0 نمیدونم چه کنم؟
🗝روش اول:
فقط یه آماتور میتونه اینجوری مشکل رو حل کنه😁😁😁
🗝روش دوم:
اوهوم. این شد یه چیزی. 😎😎
در روش اول برنامه نویس نادان بدون تفکر و اندیشه قبلی شروع به نوشتن کد نموده در صورتی در روش دوم برنامه نویس قبلا لختی درنگ کرده.
#For_all
@MatlabTips
نویسنده: #جبار_کمالی
برای: همه
پیش نیاز: (خواندن و نوشتن متون فارسی مدرن)
سطح پیچیدگی:🌑🌑🌑🌑🌑
تمام دانشجوهایی که به نوعی کارشون گیر متلب هست با احتمال خوبی کارشون گیر یک موضوعی هست که باید شبیه سازی بشه (simulated to be). این وسط یا باید یک ام فایل بنویسید یا با سیمیولینک و یا با gui (که معمولا مربوط به یک تولباکس خاصی) میشه باید کار کنید.
اما ما چطور برنامه مینویسیم؟؟(this is a big deal!)
در لپ تاپ و باز میکنیم یه یا علی میگیم و متلب و آتیش میکنیم و مثلا ادیتور رو باز میکنیم و اول برنامه هم مثل مرد یه
clc
clear all
می نویسیم که مثلا ما هم اره. یه ذره فک به پروژه فک میکنیم و تو گوشه ذهنمون تبدیل به کدش میکنیم میاریم رو صفحه ادیتور متلب. میریم جلو و به هر زور هست برنامه تموم میشه. ولی مطمئن باشید این برنامه ای نیست که بتونید بهش افتخارکنید. برنامه ای که احتمالا کامنت نداره، احتمالا به لحاظ سرعت اجرا نه تنها بهینه نیست بلکه افتضاست، احتمالا تو یه حالات خاصی جواب میده، احتمالا اسم یکی از متغیراتون a اسم یکی دیگش aa و اسم سومی aaa و تا آخر و احتمالا ...
سعی کنید قبل از اینکه شروع کنید به نوشتن یک برنامه ابتدا فلوچارت برنامه رو بکشید، بعد شبه کد آن رو بر روی کاغذ پیاده کنید و سپس "درست مثل یک حرفه ای" با اعتماد به نفس شروع میکنید به کد نوشتن.
طرح یک مشکل:
میخام نمودار sin(x)/x رو رسم کنم ولی تو نقطه X=0 نمیدونم چه کنم؟
% the problem occurs in zero(x==0) which returns NaN
x = -4*pi : pi/10 : 4*pi;
y = sin(x) ./ x;
plot(x, y,'linewidth',1.6)
🗝روش اول:
% dummy solution
x = -4*pi : pi/10 : 4*pi;
for i = 1:length(x)
if x(i)==0
y(i) = sin(eps)/eps;
else
y(i) = sin(x(i))/x(i);
end
end
plot(x, y,'linewidth',1.6)
فقط یه آماتور میتونه اینجوری مشکل رو حل کنه😁😁😁
🗝روش دوم:
% the solution which kicks ass
x = -4*pi : pi/20 : 4*pi;
x=x+(x==0)*eps; % adjustx=0tox=eps
y = sin(x) ./ x;
plot(x, y,'linewidth',1.6)
اوهوم. این شد یه چیزی. 😎😎
در روش اول برنامه نویس نادان بدون تفکر و اندیشه قبلی شروع به نوشتن کد نموده در صورتی در روش دوم برنامه نویس قبلا لختی درنگ کرده.
#For_all
@MatlabTips
نویسنده: #جبار_کمالی
🔵کدام ورژن متلب استفاده کنیم؟🔵
برای: افرادی که زیاد سوال میپرسن😕
پیش نیاز: علاقه به خواندن حرف مفت😉
سطح پیچیدگی: (مگه حرف مفتم پیچیدگی داره؟)
این سوال به اندازه سوال " استاد دفتر چند برگ تهیه کنیم؟!" خنده داره. ولی خوب به هر حال سواله دیگه و از قدیم گفتن جواب سوال واجب(تکبیر✊✊)
من میگم وقتی آخرین نسخه متلب چند صد دلاری رو میتونی با 800 تا تک تومنی سر بقالی کوچتون پیدا کنی، متلب قدیمی به چه کار آید؟؟
ولی آدم اگه برنامه نویس باشه با چرتکه هم میتونه کار خودش رو راه بندازه.
ولی از شوخی گذشته ورژن به ورژن سنگ تموم میزارن. هر چند که افرادی پیدا میشن و نسخه های قدیمی تر رو پیشنهاد میکنن (که اگه بر و بچه های مث ورکی بفهمن خودشون رو حلق آویز میکنن😁😁).
توی ورژن های 2013 یه تغییرات اساسی توی قسمت های ظاهری دادن که این تغییرات توی متلب 2015 به حد اعلای خودش رسید. در هر ورژن که ریلیز😎میشه یه سری دستورات حذف و یه سری اضاف میشه و ممکنه تولباکس های جدیدی اضافه بشه. و در نسخه جدید شتاب دهنده در جا (JIT) (اووف چی فتم) بهبود داده میشه و منجر به عملکرد بهتر متلب میشه.
خلاصه شما کارتون نباشه. برین از نزدیکترین بقالی ممکن، اخرین ورژن متلب رو گیر بیارین و مثل یه ایرانی واقعی کرک کنید.
نویسنده:(#جبار_کمالی)
#For_all
@MatlabTips
برای: افرادی که زیاد سوال میپرسن😕
پیش نیاز: علاقه به خواندن حرف مفت😉
سطح پیچیدگی: (مگه حرف مفتم پیچیدگی داره؟)
این سوال به اندازه سوال " استاد دفتر چند برگ تهیه کنیم؟!" خنده داره. ولی خوب به هر حال سواله دیگه و از قدیم گفتن جواب سوال واجب(تکبیر✊✊)
من میگم وقتی آخرین نسخه متلب چند صد دلاری رو میتونی با 800 تا تک تومنی سر بقالی کوچتون پیدا کنی، متلب قدیمی به چه کار آید؟؟
ولی آدم اگه برنامه نویس باشه با چرتکه هم میتونه کار خودش رو راه بندازه.
ولی از شوخی گذشته ورژن به ورژن سنگ تموم میزارن. هر چند که افرادی پیدا میشن و نسخه های قدیمی تر رو پیشنهاد میکنن (که اگه بر و بچه های مث ورکی بفهمن خودشون رو حلق آویز میکنن😁😁).
توی ورژن های 2013 یه تغییرات اساسی توی قسمت های ظاهری دادن که این تغییرات توی متلب 2015 به حد اعلای خودش رسید. در هر ورژن که ریلیز😎میشه یه سری دستورات حذف و یه سری اضاف میشه و ممکنه تولباکس های جدیدی اضافه بشه. و در نسخه جدید شتاب دهنده در جا (JIT) (اووف چی فتم) بهبود داده میشه و منجر به عملکرد بهتر متلب میشه.
خلاصه شما کارتون نباشه. برین از نزدیکترین بقالی ممکن، اخرین ورژن متلب رو گیر بیارین و مثل یه ایرانی واقعی کرک کنید.
نویسنده:(#جبار_کمالی)
#For_all
@MatlabTips
🔵چاپ کد(publish)🔵
پیش نیاز:(آشنایی مقدماتی با متلب)
برای: همه
سطح پیچیدگی: 🌓🌑🌑🌑🌑
شاید برای خیلی از شماها پیش اومده که یه کد طولانی رو پرینت بگیرید و در حالی که رو تختون دراز کشیدید اونو یه بار دیگه وارسی کنید. یا اصلا میخاستید که کد رو به استاد نشون بدید و به هر دلیلی.
ساده ترین راه ممکن اینه که کدتون رو کپی پیست کنید توی word و از اونجا پرینت بگیرید. ولی قطعا اگر این پست را تا انتها بخوانید هیچ وقت این عادت مسخره را تکرار نخواهید کرد.
متلب ی ابزاری داره به نام publish که توی toolbar بالایی هست بغل تب editor.(تو ورژن های 2013 به بعد مشخصه کجاست)
این publish خیلی خوبه. از اونجایی که میدونم حوصلتون نمیکشه پست طولانی بخونید من وارد جزییاتش نمیشم.
کار پابلیش اینه که میاد ام فایل شما رو بصورت html ذخیره میکنه. فک کنید توی ام فایلتون کلی فرمول (با فرمت لتک) نوشتید و کلی سکشن بندی کردید و میخاید پرینت بگیرید و به استادتون نشون بدید. میتونید توی ام فایلتون یه جوری کامنت بنویسید و سکشن بندی کنید که خروجی html اون واقعا عالی بشه. یه خروجی کاملا خوانا.
جزییاتش رو میزارم تو ویدئویی که بزودی ریلیز میکنم😎بهتون میگم.
ولی حتما حتما اگه میخاید کدتون رو پرینت بگیرید از این تکنیک استفاده کنید.
نویسنده" (#جبار_کمالی)
#For_all, #Publish
@MatlabTips
پیش نیاز:(آشنایی مقدماتی با متلب)
برای: همه
سطح پیچیدگی: 🌓🌑🌑🌑🌑
شاید برای خیلی از شماها پیش اومده که یه کد طولانی رو پرینت بگیرید و در حالی که رو تختون دراز کشیدید اونو یه بار دیگه وارسی کنید. یا اصلا میخاستید که کد رو به استاد نشون بدید و به هر دلیلی.
ساده ترین راه ممکن اینه که کدتون رو کپی پیست کنید توی word و از اونجا پرینت بگیرید. ولی قطعا اگر این پست را تا انتها بخوانید هیچ وقت این عادت مسخره را تکرار نخواهید کرد.
متلب ی ابزاری داره به نام publish که توی toolbar بالایی هست بغل تب editor.(تو ورژن های 2013 به بعد مشخصه کجاست)
این publish خیلی خوبه. از اونجایی که میدونم حوصلتون نمیکشه پست طولانی بخونید من وارد جزییاتش نمیشم.
کار پابلیش اینه که میاد ام فایل شما رو بصورت html ذخیره میکنه. فک کنید توی ام فایلتون کلی فرمول (با فرمت لتک) نوشتید و کلی سکشن بندی کردید و میخاید پرینت بگیرید و به استادتون نشون بدید. میتونید توی ام فایلتون یه جوری کامنت بنویسید و سکشن بندی کنید که خروجی html اون واقعا عالی بشه. یه خروجی کاملا خوانا.
جزییاتش رو میزارم تو ویدئویی که بزودی ریلیز میکنم😎بهتون میگم.
ولی حتما حتما اگه میخاید کدتون رو پرینت بگیرید از این تکنیک استفاده کنید.
نویسنده" (#جبار_کمالی)
#For_all, #Publish
@MatlabTips
🔵اعداد تصادفی در متلب(مقدمه: عدد تصادفی چیست؟)🔵
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیشنیاز:ندارد
برای:همه
برای همه ما پیش آمده است که با سوالاتی مانند پیدا کردن ادامه دنباله ای عددی مانند دنباله زیر روبرو شویم:
5,1,1,2,5,3,3,8,2,4,…
گاهی اوقات با تلاش زیاد می توانیم ادامه دنباله را حدس بزنیم و گاهی هم شکست میخوریم در آن لحظه ممکن است تصور کنیم که دنباله هیچ "الگوی" مشخصی ندارد و کاملا تصادفی است که ناگهان متوجه میشویم دوست باهوش تر ما ادامه دنباله را یافته است! نتیجه گیری منطقی و طبیعی که به ذهن می رسد این است که هیچ گاه نمی توان ادعا کرد که یک دنباله تصادفی است چرا که "شاید الگویی دارد که ما نمی دانیم" در مواردی این ممکن است به مغلطه توسل به جهل هم منجر شود!(فکر کنید چرا)
مشکلاتی مانند این بسیاری از ریاضیدانانی که بر روی نظریه پیچیدگی محاسباتی کار می کردند را بر آن داشت تا تعریفی ریاضی از "تصادفی بودن" ارائه دهند. تعریف کولموگروف(Kolmogrov) در این میان از همه بیشتر مورد قبول قرار گرفت. این تعریف شهودی، جامع و زیبا است. بر اساس این تعریف دنباله ای تصادفی است که حجم کدی که برای تولید آن دنباله رندم تولید می شود( به صورت مجانبی) بیشتر یا مساوی با خود دنباله باشد. در اینجا منظور از "حجم کد" دقیقا به بایت است. به عبارت ساده تر وقتی هیچ الگوریتمی وجود نداشته باشد که حجم آن از حجم دنباله کمتر باشد دنباله هم قاعدتا هیچ الگویی ندارد.(تعریف algorithmically random)
این تعریف بسیار دقیق و از لحاظ تئوریک غنی است اما در کاربرد های واقعی ما به یک تعریف عملیاتی تر نیاز داریم. تعریف عملیاتی دنباله ی تصادفی، بر اساس مفهوم "از لحاظ آماری تصادفی"(statistically random) قرار دارد. بر اساس این تعریف هر دنباله ی تصادفی می بایست تعدادی تست آماری را با موفقیت پشت سر بگذارد تا بتوان نام "رندم" بر آن نهاد. در اینجا وارد جزییات نمی شویم ولی ویژگی هایی مانند پیروی کردن از توزیع یکنواخت(یعنی تمام اعداد شانس مساوی برای حضور در دنباله داشته باشند) یا ویژگی بیشینه آنتروپی از آن دسته اند.
حالا چطور اعداد تصادفی را در کامپیوتر ایجاد کنیم؟ هر گاه این سوال را از دانشجویانم میپرسم ابتدا کمی در فکر فرو می روند و سپس شوکه می شوند. چرا که بر خلاف دسترسی راحتی که برنامه ها به تولید اعداد تصادفی ایجاد می کنند یافتن الگوریتم ساخت اعداد تصادفی، غیر ممکن به نظر می رسد!
در واقع بیشتر این برنامه ها اصلا اعداد تصادفی واقعی تولید نمی کنند. آن ها اعداد شبه تصادفی تولید می کنند. اعداد شبه تصادفی دارای فرمول هستند و دنباله ای که ایجاد می کنند تست های آماری را با موفقیت پشت سر می گذارند. یکی از معروف ترین الگوریتم های در این زمینه linear congruent generator است که از یک رابطه بازگشتی مانند زیر استفاده می کند:
سطح پیچیدگی:🌕🌑🌑🌑🌑
پیشنیاز:ندارد
برای:همه
برای همه ما پیش آمده است که با سوالاتی مانند پیدا کردن ادامه دنباله ای عددی مانند دنباله زیر روبرو شویم:
5,1,1,2,5,3,3,8,2,4,…
گاهی اوقات با تلاش زیاد می توانیم ادامه دنباله را حدس بزنیم و گاهی هم شکست میخوریم در آن لحظه ممکن است تصور کنیم که دنباله هیچ "الگوی" مشخصی ندارد و کاملا تصادفی است که ناگهان متوجه میشویم دوست باهوش تر ما ادامه دنباله را یافته است! نتیجه گیری منطقی و طبیعی که به ذهن می رسد این است که هیچ گاه نمی توان ادعا کرد که یک دنباله تصادفی است چرا که "شاید الگویی دارد که ما نمی دانیم" در مواردی این ممکن است به مغلطه توسل به جهل هم منجر شود!(فکر کنید چرا)
مشکلاتی مانند این بسیاری از ریاضیدانانی که بر روی نظریه پیچیدگی محاسباتی کار می کردند را بر آن داشت تا تعریفی ریاضی از "تصادفی بودن" ارائه دهند. تعریف کولموگروف(Kolmogrov) در این میان از همه بیشتر مورد قبول قرار گرفت. این تعریف شهودی، جامع و زیبا است. بر اساس این تعریف دنباله ای تصادفی است که حجم کدی که برای تولید آن دنباله رندم تولید می شود( به صورت مجانبی) بیشتر یا مساوی با خود دنباله باشد. در اینجا منظور از "حجم کد" دقیقا به بایت است. به عبارت ساده تر وقتی هیچ الگوریتمی وجود نداشته باشد که حجم آن از حجم دنباله کمتر باشد دنباله هم قاعدتا هیچ الگویی ندارد.(تعریف algorithmically random)
این تعریف بسیار دقیق و از لحاظ تئوریک غنی است اما در کاربرد های واقعی ما به یک تعریف عملیاتی تر نیاز داریم. تعریف عملیاتی دنباله ی تصادفی، بر اساس مفهوم "از لحاظ آماری تصادفی"(statistically random) قرار دارد. بر اساس این تعریف هر دنباله ی تصادفی می بایست تعدادی تست آماری را با موفقیت پشت سر بگذارد تا بتوان نام "رندم" بر آن نهاد. در اینجا وارد جزییات نمی شویم ولی ویژگی هایی مانند پیروی کردن از توزیع یکنواخت(یعنی تمام اعداد شانس مساوی برای حضور در دنباله داشته باشند) یا ویژگی بیشینه آنتروپی از آن دسته اند.
حالا چطور اعداد تصادفی را در کامپیوتر ایجاد کنیم؟ هر گاه این سوال را از دانشجویانم میپرسم ابتدا کمی در فکر فرو می روند و سپس شوکه می شوند. چرا که بر خلاف دسترسی راحتی که برنامه ها به تولید اعداد تصادفی ایجاد می کنند یافتن الگوریتم ساخت اعداد تصادفی، غیر ممکن به نظر می رسد!
در واقع بیشتر این برنامه ها اصلا اعداد تصادفی واقعی تولید نمی کنند. آن ها اعداد شبه تصادفی تولید می کنند. اعداد شبه تصادفی دارای فرمول هستند و دنباله ای که ایجاد می کنند تست های آماری را با موفقیت پشت سر می گذارند. یکی از معروف ترین الگوریتم های در این زمینه linear congruent generator است که از یک رابطه بازگشتی مانند زیر استفاده می کند: