rand(3)

الاسم
rand, rand_r, srand - مولد أعداد شبه عشوائية

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <stdlib.h>

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

[[deprecated]] int rand_r(unsigned int *seedp);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

rand_r():
    منذ glibc 2.24:
        _POSIX_C_SOURCE >= 199506L
    glibc 2.23 وما قبله:
        _POSIX_C_SOURCE

الوصف
ترجع الدالة rand() عددًا صحيحًا شبه عشوائي في النطاق من 0 إلى RAND_MAX شاملاً (أي النطاق الرياضي [0, RAND_MAX]).

تضبط الدالة srand() معاملها كبذرة لتسلسل جديد من الأعداد الصحيحة شبه العشوائية التي تُرجعها rand(). هذه التسلسلات قابلة للتكرار باستدعاء srand() بنفس قيمة البذرة.

إذا لم تُقدم قيمة بذرة، تُزرع الدالة rand() آليًا بقيمة 1.

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

مثل rand()، ترجع rand_r() عددًا صحيحًا شبه عشوائي في النطاق [0, RAND_MAX]. المعامل seedp هو مؤشر إلى unsigned int يُستخدم لتخزين الحالة بين الاستدعاءات. إذا استُدعيت rand_r() بنفس القيمة الأولية للعدد الصحيح المشار إليه بواسطة seedp، ولم تُعدل تلك القيمة بين الاستدعاءات، فسينتج نفس التسلسل شبه العشوائي.

القيمة المشار إليها بواسطة معامل seedp للدالة rand_r() توفر فقط كمية صغيرة جدًا من الحالة، لذا ستكون هذه الدالة مولدًا شبه عشوائي ضعيفًا. جرب drand48_r(3) بدلاً من ذلك.

قيمة الإرجاع
ترجع الدالتان rand() و rand_r() قيمة بين 0 و RAND_MAX (شاملاً). لا ترجع الدالة srand() أي قيمة.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
rand(), rand_r(), srand() | سلامة الخيوط | MT-Safe

الإصدارات
إصدارات rand() و srand() في مكتبة C للينكس تستخدم نفس مولد الأعداد العشوائية مثل random(3) و srandom(3)، لذا يجب أن تكون البتات ذات الرتبة المنخفضة عشوائية بقدر البتات ذات الرتبة العالية. ومع ذلك، في تطبيقات rand() القديمة، وفي التطبيقات الحالية على أنظمة مختلفة، تكون البتات ذات الرتبة المنخفضة أقل عشوائية بكثير من البتات ذات الرتبة العالية. لا تستخدم هذه الدالة في التطبيقات المعدة لتكون محمولة عندما تكون العشوائية الجيدة مطلوبة. (استخدم random(3) بدلاً من ذلك.)

المعايير

rand()
srand()
    C11, POSIX.1-2008.

rand_r()
    POSIX.1-2008.

التاريخ

rand()
srand()
    SVr4, 4.3BSD, C89, POSIX.1-2001.

rand_r()
    POSIX.1-2001. مهمل في POSIX.1-2008.

أمثلة
يعطي POSIX.1-2001 المثال التالي لتنفيذ rand() و srand()، ربما يكون مفيدًا عندما يحتاج المرء نفس التسلسل على جهازين مختلفين.

    static unsigned long next = 1;

    /* RAND_MAX assumed to be 32767 */
    int myrand(void) {
        next = next * 1103515245 + 12345;
        return((unsigned) (next/65536) % 32768);
    }

    void mysrand(unsigned int seed) {
        next = seed;
    }

يمكن استخدام البرنامج التالي لعرض التسلسل شبه العشوائي الذي تُنتجه rand() عند إعطائها بذرة معينة. عندما تكون البذرة -1، يستخدم البرنامج بذرة عشوائية.

    #include <stdio.h>
    #include <stdlib.h>

    int
    main(int argc, char *argv[])
    {
        int           r;
        unsigned int  seed, nloops;

        if (argc != 3) {
            fprintf(stderr, "Usage: %s <seed> <nloops>\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        seed = atoi(argv[1]);
        nloops = atoi(argv[2]);

        if (seed == -1) {
            seed = arc4random();
            printf("seed: %u\n", seed);
        }

        srand(seed);
        for (unsigned int j = 0; j < nloops; j++) {
            r =  rand();
            printf("%d\n", r);
        }

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
drand48(3), random(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.