生成不同数字的序列

问题描述

我正在尝试生成一个由 6 个随机数组成的序列,所有数字都互不相同(没有重复的数字)。但是,当我尝试通过尝试将它们打印出来来测试我是否已成功生成这些数字时,代码编译成功但屏幕上没有任何显示。我对函数 erase() 的使用似乎有问题,因为一旦我删除它,代码就会产生一些输出,尽管不是我想要的。

#include<bits/stdc++.h>
#include<time.h>

using namespace std;
int main(void)
{
    srand(time(NULL));
    vector<int>v;
    vector<int>V;
    int arr[6];
    int i,j;
    for(i=1;i<=6;i++)
    {
        V.push_back(i);
    }
    
    for(int i=0;i<6;i++)
    {
        cout<<V[i]<<" ";
    }
    for(int i=0;i<6;i++)
    {
       int n=rand()%6;
       v.push_back(V[n]);
       V.erase(V.begin()+n);
    }
    cout<<endl;
    for(int i=0;i<6;i++)
    {
       cout<<V[i]<<" ";
    }
    return 0;
}

解决方法

您使用了错误的算法:

  • 生成六个随机数
  • 如果有一些是平等的,做一些事情。

这样更好:

  • 列出所有可能的数字。
  • 从该列表中随机抽取一个数字并将其从列表中删除。这样做六次。
,

您应该使用 std::shuffle 重新排列您的号码

#include <vector>
#include <iostream>
#include <random>
#include <algorithm>
#include <numeric>

void print_numbers(const std::vector<int> & numbers) {
    for (int number : numbers) {
        std::cout << number << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector numbers(6);
    std::iota(numbers.begin(),numbers.end(),1);
    print_numbers(numbers);
    std::random_device rd; // ok for small quantities like this,generally prefer a std::default_random_engine with some seed
    std::shuffle(numbers.begin(),rd);
    print_numbers(numbers);
}