Генератор случайных чисел без повторений С++
Такая беда. Код работает почти без нареканий, но есть одно "но". Постоянно повторяется элемент массива 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 шт):
#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;
}
У вас неправильная проверка. Вот вам рабочий код.
Для корректной работы рандома необходимо выставить srand() вначале. Рекомендую дописать srand(time(NULL));
Только не забудьте подключить библиотеку "ctime"
Вот мое предложение:
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...)
По ходу выполнения работы оказалось, что нужен рандомайзер для двухмерного массива, но это уже не оказалось такой проблемой, поскольку выше дали ответ. Слегка переделал код, но пускай тоже здесь повисит, мало ли, кому-нибудь да пригодится.
#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;
}
