تخطَّ إلى المحتوى

rand / srand

أرقام عشوائية زائفة rand / srand

rand تُولّد عددًا زائف العشوائية بين 0 وRAND_MAX، وsrand تحدّد نقطة بداية التسلسل (البذرة/seed).

rand من stdlib.h ليست عشوائية حقيقية بل خوارزمية حتمية: نفس البذرة تُنتج دائمًا نفس تسلسل الأرقام. لو لم تُستدعَ srand إطلاقًا، يتصرّف البرنامج كأن srand(1) استُدعيت، فتحصل على نفس التسلسل بكل تشغيل — لهذا السبب srand(time(NULL)) شائعة جدًا لتوليد بذرة مختلفة كل مرّة اعتمادًا على الوقت الحالي.

srand يجب أن تُستدعى **مرّة واحدة فقط** قبل أي استدعاء لـ rand، وليس داخل كل حلقة — إعادة التبذير المتكرر (خصوصًا بنفس القيمة أو قيم متقاربة) يقلّل عشوائية النتائج بدل تحسينها.

الصياغة

int rand(void);
void srand(unsigned int seed);

📄 مثال

#include <stdlib.h>
#include <time.h>

srand((unsigned int)time(NULL));   // بذرة مرّة واحدة فقط

int dice = (rand() % 6) + 1;   // رقم بين 1 و6
printf("%d\n", dice);

أهم النقاط

العنصرالوظيفة
rand()يُرجع عددًا صحيحًا بين 0 وRAND_MAX (ثابت معرّف بـ stdlib.h)
srand(seed)يضبط بذرة التسلسل — استدعِها مرّة واحدة فقط قبل أي rand()
rand() % nطريقة شائعة لتضييق المدى لعدد بين 0 و n-1

💡 نصائح عملية

  • استدعِ srand مرّة واحدة فقط في بداية main، وليس داخل حلقة
  • لأغراض تحتاج عشوائية قوية فعليًا (تشفير مثلًا) لا تعتمد على rand إطلاقًا

⚠️ أخطاء شائعة

  • استدعاء srand داخل الحلقة نفسها التي تستدعي rand فيها — يقلّل تنوّع النتائج
  • توقّع عشوائية حقيقية غير قابلة للتنبؤ — rand خوارزمية حتمية بالكامل

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار C الكامل بالعربي.