1. المقدمة
في البرمجة، تُستخدم الأعداد العشوائية في مجموعة واسعة من التطبيقات، ويُستفاد منها على نطاق واسع أيضًا في لغة C. تُعد الأعداد العشوائية مفهومًا مهمًا يُستخدم في إنشاء سيناريوهات الألعاب، وأخذ عينات عشوائية، وخلط البيانات، وغيرها من الاستخدامات. في هذه المقالة، سنشرح بالتفصيل كيفية توليد الأعداد العشوائية في لغة C، مع عرض أمثلة عملية على كيفية استخدامها. لنُعمّق فهمنا لتوليد الأعداد العشوائية في C ونوسّع نطاق استخدامها.
2. ما هي الأعداد العشوائية؟
مفهوم الأعداد العشوائية والأعداد العشوائية الكاذبة
الأعداد العشوائية هي أرقام غير قابلة للتنبؤ، ويتم توليدها عادةً ضمن نطاق محدد بشكل عشوائي. ومع ذلك، فإن الأعداد التي يتم توليدها بواسطة الحاسوب تُعرف باسم “الأعداد العشوائية الكاذبة” لأنها تُنشأ استنادًا إلى خوارزميات وقواعد معينة، وبالتالي فهي ليست عشوائية بالكامل. وبما أنها تُولد بواسطة خوارزميات، فإن استخدام نفس قيمة البذرة (القيمة الأولية) سيؤدي إلى توليد نفس تسلسل الأعداد العشوائية.
3. طريقة توليد الأعداد العشوائية في لغة C
تحتوي مكتبة لغة C القياسية على دوال مخصصة لتوليد الأعداد العشوائية. فيما يلي، سنشرح بالتفصيل الدالة rand()
، والثابت RAND_MAX
، والدالة srand()
لتحديد قيمة البذرة.
أساسيات الدالة rand()
تُستخدم الدالة rand()
لتوليد أعداد صحيحة عشوائية في لغة C، وتعيد قيمة بين 0 و RAND_MAX
. يُعرّف RAND_MAX
كثابت في المكتبة القياسية، وتختلف قيمته حسب النظام أو البيئة، ولكن غالبًا ما تكون 32767.
#include <stdio.h>
#include <stdlib.h>
int main() {
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
في الكود أعلاه، يتم استخدام rand()
لتوليد عدد صحيح عشوائي بين 0 و 32767 وعرضه.
تحديد قيمة البذرة باستخدام srand()
تعتمد الدالة rand()
على قيمة البذرة لتوليد الأعداد العشوائية، وبشكل افتراضي ستُنتج نفس القيم في كل تشغيل. لتجنب ذلك، نستخدم srand()
لتعيين قيمة بذرة مختلفة، وغالبًا ما يتم استخدام الوقت الحالي كبذرة.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL)); // تهيئة البذرة بالوقت الحالي
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
في المثال أعلاه، نستخدم time(NULL)
للحصول على الوقت الحالي وتعيينه كبذرة، مما يضمن أن كل تشغيل للبرنامج سينتج أعدادًا مختلفة.
توليد أعداد عشوائية ضمن نطاق محدد
لتوليد أعداد عشوائية ضمن نطاق معين (مثال: من 1 إلى 10)، نستخدم الكود التالي:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int min = 1;
int max = 10;
int random_number = min + rand() % (max - min + 1);
printf("Random number between %d and %d: %d\n", min, max, random_number);
return 0;
}
في هذا الكود، يتم توليد عدد عشوائي بين 1 و 10 باستخدام rand() % (max - min + 1)
لضمان بقاء القيمة ضمن النطاق المطلوب.

4. أمثلة على تطبيقات توليد الأعداد العشوائية
محاكاة رمي النرد
يمكن محاكاة رمي النرد عن طريق توليد رقم عشوائي بين 1 و 6.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int) time(NULL));
int dice_roll = 1 + rand() % 6;
printf("Dice roll: %d\n", dice_roll);
return 0;
}
يعرض هذا البرنامج رقمًا عشوائيًا بين 1 و 6 كمحاكاة لنتيجة رمي النرد.
خلط عناصر المصفوفة
يمكن خلط عناصر المصفوفة عشوائيًا عن طريق تبديل مواقع العناصر.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int *array, int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int main() {
srand((unsigned int) time(NULL));
int array[] = {1, 2, 3, 4, 5, 6};
int size = sizeof(array) / sizeof(array[0]);
shuffle(array, size);
printf("Shuffled array: ");
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
يقوم هذا الكود بخلط عناصر المصفوفة عشوائيًا عن طريق تبديل مواقعها.
استخدام الأعداد العشوائية في تطوير الألعاب
في الألعاب، تُستخدم الأعداد العشوائية لتحديد مواقع ظهور الأعداء أو توليد العناصر، مما يضيف عنصرًا غير متوقع ويجعل التجربة أكثر واقعية.
5. ملاحظات حول توليد الأعداد العشوائية
حدود الدالة rand()
رغم أن rand()
كافية للتطبيقات الأساسية، إلا أنها تولد أعدادًا عشوائية كاذبة ذات دورة محددة، وقد تظهر أنماط متكررة عند توليد عدد كبير من القيم.
المشكلات في بيئة تعدد الخيوط
في بيئة متعددة الخيوط، قد يؤدي استخدام rand()
إلى توليد نفس القيم في خيوط مختلفة إذا استُخدمت نفس البذرة، لذا يجب تخصيص بذرة مختلفة لكل خيط.
استخدام مولدات أعداد عشوائية عالية الجودة
تحتوي لغات أخرى مثل ++C على مولدات أعداد عشوائية أفضل مثل random()
أو خوارزمية “Mersenne Twister” (mt19937
)، والتي يمكن استخدامها في التطبيقات التي تتطلب جودة أعلى.
6. الخلاصة
شرحنا في هذه المقالة كيفية توليد الأعداد العشوائية في لغة C، مع أمثلة عملية وتطبيقات متنوعة. تُعد الدالة rand()
أداة مفيدة للتطبيقات الأساسية، لكن يجب الحذر عند الحاجة إلى عشوائية تامة.