[進階程設] 大樂透抽獎

Posted on Thu, Oct 7, 2021 進階程設課程 C++
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;
}

我覺得第五種是最好的,因為速度上不會太慢(以這題來說幾乎差不多),而當理解原理之後,就不用一直在寫同樣的程式了。