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 الكامل بالعربي.