الرجوع الي الدرس

قيمة صحيحة عشوائية من min إلى max

أنشِئ دالة randomInteger(min, max)‎ تقوم بتوليد قيمة صحيحة عشوائية من min إلى max بما في ذلك min و max.

يجب أن يظهر كل رقم من الفترة min..max بفرص متساوية. مثال على طريقة العمل:

Examples of its work:

alert( randomInteger(1, 5) ); // 1
alert( randomInteger(1, 5) ); // 3
alert( randomInteger(1, 5) ); // 5

يمكنك استخدام حل المثال السابق كأساس لهذه المهمة.

الطريقة السهلة والخطأ

الحل الأسهل لكنه خطأ سيكون بتوليد قيمة من min إلى max وتقريبها:

function randomInteger(min, max) {
  let rand = min + Math.random() * (max - min);
  return Math.round(rand);
}

alert( randomInteger(1, 3) );

الدالة تعمل لكنها خطأ. احتمال ظهور القيم الطرفية min و max أقل بمرتين من باقي القيم. إن شغلنا المثال أعلاه لعدة مرات، فينرى ظهور 2 بصورة أكبر.

يحدث ذلك لأن Math.round()‎ تأخذ رقما من الفترة 1..3 وتُدَوِرها كما يلي:

values from 1    ... to 1.4999999999  become 1
values from 1.5  ... to 2.4999999999  become 2
values from 2.5  ... to 2.9999999999  become 3

نلاحظ الآن أن لدى 1 قيم أقل بمرتين من 2 وكذلك 3.

الطريقة الصحيحة

يوجد العديد من الطرق الصحيحة لحل هذه المهمة. إحداها هو بتعديل حدود الفترة. للتأكد من وجود فرص متساوية، نُوَلِّد قيمًا من 0.5 إلى 3.5، ثم إضافة الاحتمالات الممكنة للأطراف:

function randomInteger(min, max) {
  // (max+0.5) إلى (min-0.5) التقريب الآن من
  let rand = min - 0.5 + Math.random() * (max - min + 1);
  return Math.round(rand);
}

alert( randomInteger(1, 3) );

طريقة بديلة هي استخدام الدالة Math.floor لرقم عشوائي من min إلى max+1:

function randomInteger(min, max) {
  // (max+1) إلى min التقريب الآن من
  let rand = min + Math.random() * (max + 1 - min);
  return Math.floor(rand);
}

alert( randomInteger(1, 3) );

جميع الفترات أصبحت متوازنة الآن:

values from 1  ... to 1.9999999999  become 1
values from 2  ... to 2.9999999999  become 2
values from 3  ... to 3.9999999999  become 3

لدى جميع الفترات الطول ذاته مما يجعل التوزيع النهائي موحدًا.