2016-01-07 103 views
-1

我爲聯盟編寫了一個簡單的程序,可以生成隨機角色(AP,AD,Hybrid,Tank),泳道和冠軍。你可以在這裏看到代碼:隨機生成唯一整數C++

#include <iostream> 
#include <string> 
#include <random> 
#include <ctime> 

using namespace std; 

int main() 
{ 
    mt19937 RNG(time(0)); 
    uniform_int_distribution<int> championRoll(1, 128); 
    uniform_int_distribution<int> roleRoll(1, 4); 
    uniform_int_distribution<int> laneRoll(1, 5); 


    int iChampion, iRole, iLane; 
    string Champion, Role, Lane; 

    iChampion = championRoll(RNG); 
    iRole = roleRoll(RNG); 
    iLane = laneRoll(RNG); 

    switch (iChampion) 
    { 
    case 1: Champion = "Aatrox"; break; 
    case 2: Champion = "Ahri"; break; 
    case 3: Champion = "Akali"; break; 
    case 4: Champion = "Alistar"; break; 
    case 5: Champion = "Amumu"; break; 
    case 6: Champion = "Anivia"; break; 
    case 7: Champion = "Annie"; break; 
    case 8: Champion = "Ashe"; break; 
    case 9: Champion = "Azir"; break; 
    case 10: Champion = "Bard"; break; 
    case 11: Champion = "Blitzcrank"; break; 
    case 12: Champion = "Brand"; break; 
    case 13: Champion = "Braum"; break; 
    case 14: Champion = "Caitlyn"; break; 
    case 15: Champion = "Cassiopeia"; break; 
    case 16: Champion = "Cho'Gath"; break; 
    case 17: Champion = "Corki"; break; 
    case 18: Champion = "Darius"; break; 
    case 19: Champion = "Diana"; break; 
    case 20: Champion = "Dr. Mundo"; break; 
    case 21: Champion = "Draven"; break; 
    case 22: Champion = "Ekko"; break; 
    case 23: Champion = "Elise"; break; 
    case 24: Champion = "Evelynn"; break; 
    case 25: Champion = "Ezreal"; break; 
    case 26: Champion = "Fiddlesticks"; break; 
    case 27: Champion = "Fiora"; break; 
    case 28: Champion = "Fizz"; break; 
    case 29: Champion = "Galio"; break; 
    case 30: Champion = "Gangplank"; break; 
    case 31: Champion = "Garen"; break; 
    case 32: Champion = "Gnar"; break; 
    case 33: Champion = "Gragas"; break; 
    case 34: Champion = "Graves"; break; 
    case 35: Champion = "Hecarim"; break; 
    case 36: Champion = "Heimerdinger"; break; 
    case 37: Champion = "Illaoi"; break; 
    case 38: Champion = "Irelia"; break; 
    case 39: Champion = "Janna"; break; 
    case 40: Champion = "Jarvan IV"; break; 
    case 41: Champion = "Jax"; break; 
    case 42: Champion = "Jayce"; break; 
    case 43: Champion = "Jinx"; break; 
    case 44: Champion = "Kalista"; break; 
    case 45: Champion = "Karma"; break; 
    case 46: Champion = "Karthus"; break; 
    case 47: Champion = "Kassadin"; break; 
    case 48: Champion = "Katarina"; break; 
    case 49: Champion = "Kayle"; break; 
    case 50: Champion = "Kennen"; break; 
    case 51: Champion = "Kha'zix"; break; 
    case 52: Champion = "Kindred"; break; 
    case 53: Champion = "Kog'Maw"; break; 
    case 54: Champion = "Leblanc"; break; 
    case 55: Champion = "Lee Sin"; break; 
    case 56: Champion = "Leona"; break; 
    case 57: Champion = "Lissandra"; break; 
    case 58: Champion = "Lucian"; break; 
    case 59: Champion = "Lulu"; break; 
    case 60: Champion = "Lux"; break; 
    case 61: Champion = "Malphite"; break; 
    case 62: Champion = "Malzahar"; break; 
    case 63: Champion = "Maokai"; break; 
    case 64: Champion = "Master Yi"; break; 
    case 65: Champion = "Miss Fortune"; break; 
    case 66: Champion = "Mordekaiser"; break; 
    case 67: Champion = "Morgana"; break; 
    case 68: Champion = "Nami"; break; 
    case 69: Champion = "Nasus"; break; 
    case 70: Champion = "Nautilus"; break; 
    case 71: Champion = "Nidalee"; break; 
    case 72: Champion = "Nocturne"; break; 
    case 73: Champion = "Nunu"; break; 
    case 74: Champion = "Olaf"; break; 
    case 75: Champion = "Orianna"; break; 
    case 76: Champion = "Pantheon"; break; 
    case 77: Champion = "Poppy"; break; 
    case 78: Champion = "Quinn"; break; 
    case 79: Champion = "Rammus"; break; 
    case 80: Champion = "Rek'Sai"; break; 
    case 81: Champion = "Renekton"; break; 
    case 82: Champion = "Rengar"; break; 
    case 83: Champion = "Riven"; break; 
    case 84: Champion = "Rumble"; break; 
    case 85: Champion = "Ryze"; break; 
    case 86: Champion = "Sejuani"; break; 
    case 87: Champion = "Shaco"; break; 
    case 88: Champion = "Shen"; break; 
    case 89: Champion = "Shyvana"; break; 
    case 90: Champion = "Singed"; break; 
    case 91: Champion = "Sion"; break; 
    case 92: Champion = "Sivir"; break; 
    case 93: Champion = "Skarner"; break; 
    case 94: Champion = "Sona"; break; 
    case 95: Champion = "Soraka"; break; 
    case 96: Champion = "Swain"; break; 
    case 97: Champion = "Syndra"; break; 
    case 98: Champion = "Tahm Kench"; break; 
    case 99: Champion = "Talon"; break; 
    case 100: Champion = "Taric"; break; 
    case 101: Champion = "Teemo"; break; 
    case 102: Champion = "Thresh"; break; 
    case 103: Champion = "Tristana"; break; 
    case 104: Champion = "Trundle"; break; 
    case 105: Champion = "Tryndamere"; break; 
    case 106: Champion = "Twisted Fate"; break; 
    case 107: Champion = "Twitch"; break; 
    case 108: Champion = "Udyr"; break; 
    case 109: Champion = "Urgot"; break; 
    case 110: Champion = "Varus"; break; 
    case 111: Champion = "Vayne"; break; 
    case 112: Champion = "Veigar"; break; 
    case 113: Champion = "Vel'Koz"; break; 
    case 114: Champion = "Vi"; break; 
    case 115: Champion = "Viktor"; break; 
    case 116: Champion = "Vladimir"; break; 
    case 117: Champion = "Volibear"; break; 
    case 118: Champion = "Warwick"; break; 
    case 119: Champion = "Wukong"; break; 
    case 120: Champion = "Xerath"; break; 
    case 121: Champion = "Xin Zhao"; break; 
    case 122: Champion = "Yasuo"; break; 
    case 123: Champion = "Yorick"; break; 
    case 124: Champion = "Zac"; break; 
    case 125: Champion = "Zed"; break; 
    case 126: Champion = "Ziggs"; break; 
    case 127: Champion = "Zilean"; break; 
    case 128: Champion = "Zyra"; break; 
    } 

    switch (iRole) 
    { 
    case 1: Role = "AD"; break; 
    case 2: Role = "AP"; break; 
    case 3: Role = "Hybrid"; break; 
    case 4: Role = "Tank"; break; 
    } 

    switch (iLane) 
    { 
    case 1: Lane = "Top"; break; 
    case 2: Lane = "Mid"; break; 
    case 3: Lane = "ADC"; break; 
    case 4: Lane = "Support"; break; 
    case 5: Lane = "Jungle"; break; 
    } 

    cout << Role << " " << Champion << " " << Lane << endl; 

    system("PAUSE"); 
    return 0; 
} 

我想要做的就是讓這個程序一次生成5行。這有兩個問題。

第一個問題是我需要冠軍和車道是獨一無二的價值,因爲你不能在同一場比賽中有兩個。所以我不確定如何做到這一點。有沒有辦法將一組整數放入一個數組,如果有重複的數字,交換刪除它們並立即生成新的數字?這只是一個猜測。

第二個問題是我的種子是時間,那麼有沒有辦法讓程序每次生成一行時等待1秒?

+0

您可能想使用「set」數據結構來保存整數的唯一值.http://en.cppreference.com/w/cpp/container/set – Beed

+0

爲什麼您認爲您需要等待第二?您只需設置一次隨機種子,然後生成一個隨機序列,無需重新播種。另外,術語中的「行」是什麼?我不熟悉「聯盟」或大部分其他條款,而且大多數信息似乎都是不必要的。你基本上只是問如何生成n個隨機數,這樣就沒有重複? –

+0

查找'random_shuffle()'算法。 – Peter

回答

3

第一個問題是我需要冠軍和車道是獨一無二的價值,因爲你不能在同一場比賽中有兩個。

您可以通過創建一個包含所有必需的通道陣列/向量解決這個問題,那麼洗牌它:

std::vector<lane> lanes{lane::top, lane::bot, lane::jng, lane::mid}; 
std::shuffle(std::begin(lanes), std::end(lanes), RNG); 

之後,您可以在lanes矢量迭代,這是保證你會得到所有的車道都是隨機的。

我建議創建一個幫手make_shuffled_vector<T>(...)函數來避免樣板。


的第二個問題是,我的種子是時間,所以是有辦法使程序每次生成線時間等待1秒?

您應該使用std::random_device

std::random_device rd; 
std::mt19937_64 gen(rd()); 

如果硬件支持可用,則使用它生成種子。否則,默認種子是實現定義的。

我建議您閱讀this article以獲取有關默認播種的更多信息。


或者,可以通過避免繁瑣且容易出錯switch構建了這個問題。

下面是解決它乾淨,利用可變參數模板的一個可能的方式:

template<typename T, typename... Ts> 
auto make_shuffled_vector(Ts... xs) 
{ 
    // Note: perfect-forwarding intentionally omitted to 
    // enhance example readability. 

    std::vector<T> v{xs...}; 
    std::shuffle(std::begin(v), std::end(v), RNG); 
    return v; 
} 

auto champions = make_shuffled_vector<string>(
    "Vayne (best champion.)", "Caitlyn", "Lulu", 
    "Teemo (Satan)", ...); 

auto lanes = make_shuffled_vector<string>(
    "mid", "top", "bot(adc)", "bot(sup)", "jng"); 

// You may want roles to be duplicated (not shuffled). 
// This is just an example. 
auto roles = make_shuffled_vector<string>(
    "ad", "ap", "tank", "hybrid"); 

// Get the `i-th` element from `vec`, cycling if end is reached. 
auto get_cycled = [](const auto& vec, auto i) 
{ 
    return vec[i % vec.size()]; 
}; 

// Get 5 champions: 
for(int i = 0; i < 5; ++i) 
{ 
    std::cout 
     << lanes[i]  // Assumes there always are >=5 lanes. 
     << champions[i] // Assumes there always are >=5 champions. 
     << get_cycled(roles, i) 
     << "\n"; 
} 

如果要沿着這條路走下去,你可以找到a real implementation of make_vector here,它可以被用來實現make_shuffled_vector

+0

雖然可變模板很酷,但我不確定這是否是一個很好的用例。接受'std :: vector '將需要您在函數調用中鍵入兩個額外的大括號,但該函數將更通用,並且任何數量的項目都可以執行單個實例化。 – 5gon12eder

+0

我看過這行代碼'std :: vector lane {lane :: top,lane :: bot,lane :: jng,lane :: mid};'這麼多次,我已經用google搜索過了載體,並問其他人,但我沒有得到我應該把你的「車道::頂部,車道::機器人,」等等什麼數字去那裏? – Riggs

+0

@Riggs:'enum class lane {top,bot,jng,mig};' - 查看枚舉類和枚舉類 –