生成随机值数组而不重复

时间:2018-01-13 23:33:57

标签: c++ arrays

我想制作一个方法,在其中生成一个介于0和6之间的随机值的数组,而不重复这些值。

这就是我所拥有的:

void randomArray(){

randNum = rand() % 6;
code[0] = randNum

for (int i = 1; i < 4; i++){

  randNum = rand() % 6;
  code[i] = randNum;

  while (code[i] == code[i - 1]){
  randNum = rand() % 6;
  code[i] = randNum;
  }
 }
}

但是我在随机生成的数组上得到重复值。

PD:我还需要使用类似的方法制作一个枚举数组。

3 个答案:

答案 0 :(得分:0)

你可以这样做:

int randomFromSet(std::vector<int>&_set)
{
    int randIndex = rand() % _set.size();
    int num = _set[randIndex];
    _set.erase(_set.begin() + randIndex);
    return num;
}

这会从提供的一组数字中选择一个随机int,并从该组中删除该选项,以便不能再次选择它。 像这样使用:

std::vector<int> mySet {0,1,2,3,4,5,6};
std::cout<<randomFromSet(mySet)<<'\n;

答案 1 :(得分:0)

#include <random>
#include <vector>
#include <numeric>
#include <iostream>
using std::cout;
using std::endl;

int main() {
    const int sz = 7;
    std::vector<int> nums(sz);
    std::iota(std::begin(nums), std::end(nums), 0);

    std::default_random_engine re;

    int i = 8;
    while(--i > 0) {
        auto my_set{ nums };
        std::shuffle(my_set.begin(), my_set.end(), re);

        for (auto x : my_set) {
            cout << x << " ";
        }
        cout << endl;
    }
}

答案 2 :(得分:0)

我是c ++的新手,我也可以添加我的答案吗? 它的c风格的c ++很抱歉。但它很容易编码并同时理解。

#include <iostream> //std::cout
#include <ctime> //time() function
#include <cstdlib> //rand() and srand() functions

void rand_gen(unsigned int arr[],unsigned int sizeofarray)
{
srand((unsigned int)time(0);

for (unsigned int c = sizeofarray ; c > 0 ; c--)
{
unsigned int r = rand()%sizeofarray;

if (arr[r] != 404)
{

std::cout<<"Try No."<<(sizeofarray+1)-c<<" : "<<arr[r]<<"\n";

arr[r] = 404;

} else {  c++;   }
}
}

int main()
{
unsigned int n[7]={0,1,2,3,4,5,6};

rand_gen(n,7);

std::cin.get();
return 0;
}