簡體   English   中英

如何創建一個不會重復結果的隨機事件?

[英]How can I create a random event that will not repeat results?

我正在嘗試使用Xcode和C ++創建一個團隊生成應用程序,該應用程序將生成三個或四個團隊。 目前,我能夠輸入名稱並使用數組隨機生成團隊:

    for (j=1;j < count; j++) {

    int index=rand() % count;


    NSString *temp = Array[j];
    Array[j]=Array[index];
    Array[index]=temp;

從這個數組中,我將根據數組的順序分配三人一組。 因此,數組[1],[2]和[3]組成了團隊#1。 數組[4],[5]和[6]組成了小組#2,因此排名第四。

從這里開始,我想使用與以前相同的名稱池來隨機組建新團隊,但不要讓人們與已經在團隊中的人組成團隊。

例如,如果人#1,#2和#3都放在同一個團隊中,則下次我生成團隊時,人#1,#2和#3都將在單獨的團隊中。

這是我目前的主要重點。 最終,我希望能夠對程序進行調整,以允許重復的團隊成員,因為在以后的團隊中不再需要非重復的團隊成員。

我不確定四人一組或三人一組是否正確,但是要避免數學上的復雜性(檢查越來越多的指數可能性); 我建議您生成每個可能的團隊並隨機選擇團隊,而不是嘗試隨機生成它們並按順序進行。

我錯過了算法的一部分,因此我將在這里放一個簡化版,供3名玩家使用。

typedef std::tuple<Player,Player,Player> team;
std::vector<Team> definitive_teams, list_of_teams;

//that's the part where I miss the algorithm,
//where you create EACH possible team
//and store them
list_of_teams.reserve(Number_of_team_max); //you have to figure that too
list_of_teams.push_back(make_tuple(arg1,arg2,arg3));
//then simply :

definitive_teams.resize(list_of_teams.size());

size_t index;
std::srand(std::time(0));
for (size_t i {0};i < definitive_teams.size();++i)
{
    index= std::rand()%(list_of_teams.size() - i);
    definitive_teams[i] = list_of_teams[index];
    if (index != list_of_teams.size() - i)
        swap(list_of_teams[index],list_of_teams[list_of_teams.size() - i]);
}

然后,您便擁有了全部東西。

對不起,部分解決方案。

您在這里需要小心。 在某些情況下,您無法根據這些規則組建團隊。 例如,如果您將6個人分成2個3人的團隊,那么將無法生成第二組。

您還可以進入部分放置的狀態,那里沒有解決方案,僅涉及向團隊中添加球員。 這意味着您不能隨便挑剔並拒絕加入包含您之前所在成員的團隊。

我認為最簡單的解決方案是改組整個狀態,直到正確為止。

為此,您可以使用std::random_shuffle()隨機排列數組,直到找到有效的配置為止。 請注意,如果沒有有效的解決方案,它將永遠搜索,如果實際上只有很小一部分配置有效,則可能需要很長時間。

如果您想遍歷所有可能性,還可以使用std::next_permutation() 但是,除非團隊成員人數少,否則將有大量可能的配置。 您可以略微減少組合的數量,因為團隊中的玩家可以是任意順序。

這似乎是回溯的明顯案例。 不確定這是否是最有效的方法,但是它比隨機算法簡單,而且肯定比隨機算法要好。

所需的第一個數據結構是同一團隊中的一組團隊成員。 對於N個人來說,這是(N N-1)/ 2組布爾。 使用完整的N N陣列可能更容易 std::vector<std::vector<bool>> conflicts

第二個數據結構只是std::vector<bool> assigned的bod std::vector<bool> assigned的數組,指示當前回合中已經將哪些人分配給了團隊。

第三個數據結構是實際的團隊分配,由人員和團隊共同確定。 在幕后,最好用兩個數組來實現,一個數組中的人員編號是索引,另一個數組中的團隊編號是索引。

該算法的工作原理如下

In each round:
  Set all teams to empty
  Find first non-assigned person in `assigned`
    Add person to first team that has <4 members and no conflicts.
    If not team found, backtrack:
      Undo the assignment of the _previous_ person
      Assign person to the next possible team
    When team found: 
       Update `assigned`
       Update team membership
  Until all people assigned to teams
  Update `conflicts` with team membership from this round
Continue with next round

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM