Ошибка программы на простом C.. Не удалось ее устранить

Я пытаюсь генерировать случайные числа в C, используя srand(). Я хочу генерировать числа от 1 до 25 без дублирования, поэтому я реализовал следующую программу.

#include <stdio.h> 
#include <time.h>
int main()
{
int i=0,n,a[25]={0},b[25]={0},cntr=0;
srand(time(NULL));
while(cntr!=25)
{
    n=rand()%26;
    if(n!=9)
    {
        if(a[n]!=1)
        {
            a[n]=1;
            printf("%d  ",n);
            b[i]=n;
            printf("%d\n",b[i]);
            cntr++;
            i++;
        }
    }
}
for(i=0;i<25;i++)
{
    printf("%d  ",b[i]);
}
return 0;
}

Теперь есть странная проблема. Когда я печатаю массив b внутри цикла, где генерируется случайное число, он печатает правильные числа. Но когда я печатаю его вне цикла, первый элемент массива b меняется на 1, и я получаю дублирующее значение 1 в случайных числах. Буду признателен, если кто-нибудь может помочь найти ошибку в программе.

Вот ссылка на ideone, где я предоставил вывод программы: Ideone Link

2 ответа

Решение

Вы заявляете a[25] но вы получаете доступ к любому из 26 элементов, так как n=rand()%26;так что объявляй вместо

 int i=0,n,a[26]={0},b[26]={0},cntr=0;

Кстати, скомпилируйте все предупреждения и отладочную информацию (например, gcc -Wall -Wextra -g). Тогда используйте отладчик (gdb). Точка наблюдения помогла бы.

there are several little oops in the posted code.
the following corrects those oops

#include <stdio.h>
#include <stdlib.h> // srand(), rand()
#include <time.h>   // time()

int main()
{
    int i=0; // generated number counter
    int n;  // generated number
    int a[25]={0}; // tracks which numbers have been generated
    int b[25]={0}; // random array of numbers 1...25

    srand(time(NULL));

    while(i<25)  // correct loop termination
    {
        n=rand()%25+1; // yields 0...24 +1 gives 1...25

        if(a[n]!=1)
        { // then, number not previously generated
            a[n]=1;   // indicate number generated

            printf("%d  ",n); // echo number

            // save number in current location in array 'b'
            b[i]=n;
            printf("%d\n",b[i]);  // echo number again

            i++; // step offset into array 'b' (and loop counter)
        } // end if
    } // end while

    for(i=0;i<25;i++)
    {
        printf("%d  ",b[i]);
    } // end for

    return 0;
}  // end function: main
Другие вопросы по тегам