I have this:
#include <iostream>
using namespace std;
int main()
{
int a[256];
int b;
int k;
for (int i = 0; i < 256; i ++){
b = rand()%256;
k = 0;
for (int j = 0; j< i; j ++)
{
if (a[j] == b){k = 1;}
}
if (k == 0){a[i] = b;}
if (k==1){i--;}
}
return 0;
}
This generates an array of integers from 0 to 255. Each integer only occur once in the array. My problem is that this code takes quite a while to execute because for each new random integer I check whether or not the integer is already in the array. So I have to wait until all the integers from 0 to 255 have showed up as a random number. My question is:
Is there is a better way to do this?
std::random_shuffle
is the way to go, as previously mentioned, but just in case you don't want to use it (maybe using ANSI C instead of C++), here's a quick-and-dirty implementation:
#include <stdlib.h>
#include <time.h>
#define SIZE 256
static inline void
swap(int *a, int *b) {
// Don't swap them if they happen to be the same element
// in the array, otherwise it'd be zeroed out
if (a != b) {
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
}
int main(void)
{
int A[SIZE], i;
// Initialize array with sequential incrementing numbers
for (i = 0; i < SIZE; ++i)
A[i] = i;
// Initialize random seed
srand(time(NULL));
// Swap every element of the array with another random element
for (i = 0; i < SIZE; ++i)
swap(&A[i], &A[rand() % SIZE]);
return 0;
}
As others mentioned, use std::random_shuffle:
std::vector<int> my_vec(256); //Reserve space for 256 numbers in advance.
for(int n = 0; n < 256; ++n)
{
my_vec.push_back(n);
}
std::random_shuffle(my_vec.begin(), my_vec.end());
You could try something like this:
int main()
{
std::vector<int> available(256);
int a[256];
for (int i = 0; i < 256; ++i)
available.push_back(i);
for (int i = 0; i < 256; ++i)
{
int idx = rand() % available.size();
a[i] = available[idx];
available.erase(available.begin()+idx);
}
// use a[] as needed...
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
int main(int argc, const char * argv[])
{
std::vector<int> items(256);
std::iota(items.begin(),items.end(),0);
std::random_shuffle(items.begin(), items.end());
for(auto i:items)
std::cout<<i<<" ";
}