السلام عليكم ورحمة الله وبركاته
يُمكن باستخدام التابع rand الموجود في مكتبة cstdlib توليد عدد شبه عشوائي من نوع int تقع قيمته بين 0 و RAND_MAX (وهي قيمة محددة في مكتبة stdlib.h بقيمة 32767، وفيما يلي مثالٌ بسيط:
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
int main()
{
srand(time(0));
cout<<rand()<<endl;
return 0;
}
قمنا في الشيفرة السابقة بتحديد بذرة الأعداد العشوائية seed عن طريق التابع srand، حيث مررنا قيمة (0)time التي تعيد عدد اللحظات التي مرت منذ 1/1/1970 حتى لحظة استدعاء التابع.
والسؤال هو: كيف يُمكن توليد عدد عشوائي بين قيمتين نحدّدهما نحن؟
سنقوم بتحديد القيمة عن طريق المتراجحات الرياضية التالية:
0<rand<32768
بإضافة العدد a
a<rand+a<32768+a
بأخذ باقي القسمة على b (بفرض b أكبر من a)
a<(rand+a)%b<b
ما سأطرحه اليوم، هو طريقة مغايرة للطريقة السابقة، تسمح لنا بتوليد عدد عشوائي من نوع double مع تحديد قيمته بين عددين، وفق العلاقات التالية:
0<rand<32768
بقسمة جميع الأطراف على 32768
0<double(rand)/32768<1
والآن نقوم بضرب جميع الأطراف بالقيمة b-a
0<(double(rand)/32768)*(b-a)<b-a
بإضافة العدد a
a<(double(rand)/32768)*(b-a)+a<b
يكون لدينا عدد عشوائي بين a و b من نوع double، ولكن لا ننسى أنه سيكون هناك فقط 32768 قيمة مختلفة للعدد العشوائي المولد
والله ولي التوفيق