اغلب در هنگام توسعه پروژه‌ها به دنبال راه‌هایی برای تولید اعداد تصادفی هستیم. در این مطلب، نحوه استفاده از Math.random در جاوااسکریپت برای تولید اعداد تصادفی را بررسی خواهیم‌کرد.

متد Math.random

Math یکی از آبجکت‌های built-in جاوااسکریپت است که ویژگی‌ها و متدهای متعددی برای انجام محاسبات ریاضیاتی دارد.

یکی از کاربرد‌های متداول آبجکت Math برای ایجاد اعداد تصادفی با استفاده از متد random است.

 

const randomValue = Math.random();

 

این متد یک عدد کامل برنمی‌گرداند، بلکه یک مقدار اعشاری در بازه‌ی ۰ تا ۱ برمی‌گرداند. این مقادیر pseudo-random هستند، به این معنی که هرچند این مقادیر از نظر آماری تصادفی هستند اما ممکن است تکراری باشند و در نهایت پس از یک دوره‌ی زمانی الگوی غیرتصادفی داشته‌‌باشند. علت این اتفاق ذات الگوریتم‌های تولید‌کننده اعداد تصادفی است که هیچ ‌قت نمی‌توانند کاملا تصادفی باشند.

برای مطالعه بیشتر در مورد متد‌های Math.random می‌توانید به این لینک مراجعه کنید.

تابع تولید‌کننده اعداد تصادفی

در این قسمت، از متد Math.random برای ساختن یک تابع که یک عدد صحیح تصادفی بین دو مقدار مشخص را برمی‌گرداند، استفاده می‌کنیم.

 

const getRandomNumber = (min, max) => {
  return Math.floor(Math.random() * (max - min + 1)) + min
}

 

متد Math.random در این تابع یک عدد اعشاری در بازه ۰ تا ۱ برمی‌گرداند. لذا بازه‌های اعداد به صورت زیر خواهند بود:

 

[۰ .................................... ۱)

[min .................................... max)

 

با فاکتورگیری می‌توانیم بازه‌ی دوم را به صورت بازه‌ای از اعداد بین ۰ و max-min تبدیل کنیم:

 

[۰ .................................... ۱)

[۰ .................................... max - min)

 

اکنون برای بدست آوردن یک عدد تصادفی از کد زیر استفاده می‌کنیم که در اینجا x عدد تصادفی است:

 

const x = Math.random() * (max - min)

 

در این حالت مقدار max در بازه‌ی مورد نظر ما قرار ندارد. برای اینکه بازه‌ اعداد شامل max نیز باشد مقدار ۱ و مقدار min را که قبلا کم کرده‌ بودیم، دوباره اضافه کنیم تا مقدار عدد تصادفی ما در بازه [min,max) باشد.

 

const x = Math.random() * (max - min + 1) + min

 

در مرحله آخر، هدف این است که مطمئن شویم مقدار x همواره مقداری صحیح یا integer است:

 

const x = Math.floor(Math.random() * (max - min + 1)) + min

 

در این مرحله می‌توانیم به جای متد floor از متد round استفاده کنیم. اما این متد اعداد را با توزیع غیریکنواختی ایجاد می‌کند. به این معنی که با استفاده از floor، هردو max و min از شانس یکسانی برای اینکه خروجی تابع باشند برخوردارند و توزیع یکنواختی دارند.

 

[button class=”github-btn” href=”http://frontcast.ir/course/data-structures-and-algorithms”]دوره ساختمان داده و الگوریتم‌ها در جاوااسکریپت[/button]