سؤال

for(i = 0; i < n; i++){
        srand(time(NULL));
        printf("%d ", time(NULL));
        for(j = 0; j < (n-1); j++){
            a[i][j] = rand();
        }
    }

أحاول توليد أرقام عشوائية، لكنها هي نفسها ... أحاول srand(i * time(NULL)). وبعد لا يهم .. ماذا يجب أن أفعل؟

إعلان صفيف:

int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);

a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
    a[i] = (int*)calloc(n-1, sizeof(int));
هل كانت مفيدة؟

المحلول

يتصل srand() خارج الحلقة. أنت إعادة التباين كل التكرار.

srand() البذور مولد الأرقام العشوائية حتى تحصل على تسلسل مختلف لأرقام عشوائية اعتمادا على الإدخال. يمتد حلقة الخاص بك بسرعة كبيرة، وبالتالي فإن الدعوة إلى time(NULL) إرجاع دائما نفس القيمة. أنت تقوم بإعادة تعيين نفس التسلسل العشوائي مع كل التكرار. كقاعدة عامة، اتصل فقط srand() مرة واحدة في البرنامج الخاص بك.

نصائح أخرى

لا تتصل srand() في كل مرة من خلال الحلقة - فقط تفعل ذلك مرة واحدة مسبقا.

أسئلة وأجوبة 13.15 ل 13.20 سيكون من الاهتمام. وأنا أتم إغراء إنشاء علامة جديدة لهذه الأسئلة.

srand هي وظيفة "البذور" مولد الأرقام العشوائية. في حال كنت لا تعرف، فإن الأرقام العشوائية في أجهزة الكمبيوتر ليست عشوائية حقا. في الواقع، يحتوي الكمبيوتر فقط على قائمة بالأرقام التي تبدو عشوائية فيها، وتستخدمها srand لمعرفة ذلك أين تبدأ في تلك القائمة، مع كل مكالمة rand() إرجاع العنصر التالي في القائمة.

السبب في الكتابة srand(time(NULL)) هو الحصول على أرقام عشوائية للبدء في نقطة ما لن تكون هي نفسها في كل مرة تقوم فيها بتشغيل البرنامج (ما لم تبدأ البرامج في نفس الوقت).

إذن ما تفعله هنا يخبر البرامج بشكل متكرر بإعادة تشغيل قائمة الأرقام العشوائية في نفس النقطة (لأن الوقت هو نفسه في كل مرة تذهب فيها الحلقة). نقل المكالمة إلى srand خارج الحلقة وستحصل على النتائج الصحيحة.

alt text

srand(time(NULL)); 

for(i = 0; i < n; i++){         
        printf("%d ", time(NULL)); 
        for(j = 0; j < (n-1); j++){ 
            a[i,j] = rand(); 
        } 
    } 

اتصل ب Srand مرة واحدة خارج الحلقة.

تحتاج إلى الاتصال srand() قبل دخول الحلقة. srand() تهيئة مولد رقم RADNOM مع البذور المحددة ويولد تسلسل فريد من أرقام عشوائية لهذه البذور.

ينفذ حلقة الخاص بك بسرعة كبيرة لذلك كل مكالمة time(NULL) تعطي في الوقت نفسه (تقاس بالثواني) - وبالتالي تقوم بتهيئة مولد الأرقام العشوائية مع نفس البذور على كل تكرار حلقة.

srand(time(NULL));
for(i = 0; i < n; i++){
    for(j = 0; j < (n-1); j++){
        a[i,j] = rand();
    }
}

لا يهم. الرقم هو نفسه ...

int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);
if( n < 1 ){
    printf("Size should be > 0\n\n");
    return NULL;
}
a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
    a[i] = (int*)calloc(n-1, sizeof(int));

هنا هو صفيف بلدي ...

سيرجي، لم تحصل على رسالة خطأ مع a[i,j] النسخة ببساطة لأن هذا تعبير صحيح تماما. يقوم مشغل الفواصل بتقييم التعبيرات الفرعية من اليسار إلى اليمين وإرجاع قيمة التعبير الأخير. وهكذا، الكتابة a[i,j] مطابق ل a[j]. وبعد كان ما تلقيته في الطباعة قيمة المؤشر إلى متجه J-Th في مصفوفةك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top