2021-10-21更新
第一種:檢查是否抽過
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int a[6]={};
int temp,now_i;
for(int i=0;i<6;i++){
temp=rand()%42;
now_i=i;
for(int j=0;j<i;j++){
if(temp==a[j]){
i--;
break;
}
}
if(now_i==i){
a[i]=temp;
}
}
for(int i=0;i<6;i++){
cout<<a[i]<<endl;
}
return 0;
}
第二種:標記已抽過號碼
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int temp;
int a[42]={0};//沒抽過->0
for(int i=0;i<6;i++){
temp=rand()%42;
if(!a[temp])
{
a[temp]=1;
cout<<temp+1<<endl;
}else
{
i--;//這次不算
}
}
return 0;
}
第三種:動態陣列
#include <bits/stdc++.h>
using namespace std;
int main()
{
srand(time(NULL));
vector<int> v;
int temp;
for(int i=0;i<42;i++) v.push_back(i);
for(int i=0;i<6;i++){
temp=rand()%v.size();
cout<<v[temp]<<endl;
v.erase(v.begin()+temp);
}
return 0;
}
第四種:打亂陣列
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(NULL));
int a[42],num=0;
for(int i=1;i<=42;i++) a[i]=i;
for(int i=0;i<42;i++){
num=rand()%42;
swap(a[i],a[num]);
}
for(int i=0;i<6;i++) cout<<a[i]<<endl;
return 0;
}
第五種:random shuffle
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
srand(time(NULL));
vector<int> v;
for(int i=1;i<=42;i++) v.push_back(i);
random_shuffle(v.begin(),v.end());
for(int i=0;i<6;i++) cout<<v[i]<<endl;
return 0;
}
我覺得第五種是最好的,因為速度上不會太慢(以這題來說幾乎差不多),而當理解原理之後,就不用一直在寫同樣的程式了。