Генератор случайных чисел без повторений С++

Такая беда. Код работает почти без нареканий, но есть одно "но". Постоянно повторяется элемент массива array[0] с каким-либо другим элементом. Есть подозрение, что беда внутри второго цикла, который производит проверку значений по массиву, но не вижу, где косяк. Помогите, люди добрые.

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

int main ()
{
    int n;
    int array[100]={0};

    for(int i=0;i<=31;i++)
    {
        n=rand()%32;
        for(int j=0;j<=31;j++)
        {
            if(n==array[j]) 
            {
                j=0;
                n=rand()%32;
            }       
        }
        array[i]=n;
        printf("%d\n",n);   
    }
}

Дополняемся. Поппробовал воспользоваться советом @Harry. Выходит странная последовательность нулей на выходе.

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

int main ()
{
    int array[100]={0};
    int j, n, k;
    for(int i=1;i<=32;i++)
    {
        array[i]=i;
        printf("%d ",i);
    }

    printf("\n");

    for(int i=1;i<=32;i++)
    {
        n=rand()%32+i;

        j=array[i];
        k=array[n];
        array[i]=k;
        array[n]=j;

        printf("%d ",array[i]);
    }
}

введите сюда описание изображения


Ответы (4 шт):

Автор решения: Leskhan Muratuly
#include <iostream>
#include <stdlib.h>
#include <time.h>

int main()
{
    setlocale(LC_ALL, "rus");
    srand(time(NULL));

    int sizeOfArray;
    std::cout << "Введите размер массива: ";
    std::cin >> sizeOfArray;

    int* array = new int[sizeOfArray];

    bool already;

    for (int i = 0; i < sizeOfArray;)
    {
        already = false;
        int valueForRand = rand() % 20;

        for (int j = 0; j < i; j++)
        {
            if (array[i] == valueForRand)
            {
                already = true;
                break;
            }
        }

        if (!already)
        {
            array[i] = valueForRand;
            i++;
        }
    }

    for (int i = 0; i < sizeOfArray; i++)
    {
        std::cout << array[i] << "  ";
    }

    delete[] array;

    std::cout << std::endl;
    return 0;
}

У вас неправильная проверка. Вот вам рабочий код.

→ Ссылка
Автор решения: MikitaS

Для корректной работы рандома необходимо выставить srand() вначале. Рекомендую дописать srand(time(NULL));

Только не забудьте подключить библиотеку "ctime"

→ Ссылка
Автор решения: Harry

Вот мое предложение:

int main()
{
    int a[32];
    for(int i = 0; i < 32; ++i) a[i] = i;

    for(int i = 0; i < 32; ++i)
    {
        int j = rand()%(32-i)+i;
        int t = a[i]; a[i] = a[j]; a[j] = t;
    }

    for(int i = 0; i < 32; ++i) cout << a[i] << " ";
    cout << endl;

}

Или, используя стандартную библиотеку,

int a[32];
for(int i = 0; i < 32; ++i) a[i] = i;

shuffle(a,a+32,default_random_engine(random_device()()));

for(int i = 0; i < 32; ++i) cout << a[i] << " ";
cout << endl;

Ваш способ должен выглядеть так:

for(int n, i = 0; i < 32; ++i)
{
    bool ok;
    do {
        ok = true;
        n = rand()%32;
        for(int j = 0; j < i; ++j)
            if (a[j] == n) { ok = false; break; }
    } while(!ok);
    a[i] = n;
}

Только вот эксперимент показывает, что в моем случае всегда rand() вызывается 32 раза, в то время как в вашем - 130±39 раз (по 100000 экспериментов; минимально потребовалось 52 вызова, максимально - 416...)

→ Ссылка
Автор решения: Sb4

По ходу выполнения работы оказалось, что нужен рандомайзер для двухмерного массива, но это уже не оказалось такой проблемой, поскольку выше дали ответ. Слегка переделал код, но пускай тоже здесь повисит, мало ли, кому-нибудь да пригодится.

#include <iostream>
#include <stdlib.h>
#include <random>

int main ()
{
    using namespace std;

    int i,j,num=0;
    int a[8][8]={0};

    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
        {
            num++;
            a[i][j]=num;
        }

    }

    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
        {
            int btwi=rand()%(8-i)+i;
            int btwj=rand()%(8-j)+j;
            int t=a[i][j]; a[i][j]=a[btwi][btwj]; a[btwi][btwj]=t;
        }   
    }

    for(int i=0;i<8;++i) 
    for(int j=0;j<8;++j) 
    cout << a[i][j] << " ";

    cout << endl;
}
→ Ссылка