C 计数器用于从数组中选择事物

C++ counter for selecting things from an array

本文关键字:选择 数组 计数器 用于      更新时间:2023-10-16

我有一些代码,这些代码会从其他位置中随机选择元素和商店的元素,但是我只想能够选择一定次的元素每个。这是我的代码的摘录,概述了该问题。(对STD表示歉意,但这还不足以让我保证不使用STD(。

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void setDaysOff();
string prepClasses[] = { "FREE", "1X", "4A", "4X", "5A", "5X", "6B", "6X" };
string seniorClasses[] = { "FREE", "7A", "7B", "7AB",
    "8A", "8B", "8AB", "9A", "9B", "9AB", "10D", "10T","10X", "10AX",
    "10BX", "10CX", "10Q", "11D", "11T", "11X", "11AX", "11BX", "11CX" };
string timetable[25][6][5];
int main() {
    // ZEROING
    setDaysOff();
    // END OF ZEROING
    srand ( time(NULL) );
    int RandIndex;
    int a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0, a7 = 0, a8 = 0, a9 = 0, a10 = 0,
        a11 = 0, a12 = 0, a13 = 0, a14 = 0, a15 = 0, a16 = 0, a17 = 0, a18 = 0, a19 = 0,
        a20 = 0, a21 = 0, a22 = 0, a23 = 0;
    for(int k = 0; k < 5; k++) {
        for(int i = 0; i < 25; i++) {
            for(int j = 0; j < 6; j++) {
                if(timetable[i][j][k] != "0") {
                    RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                if(RandIndex == 0) {
                    a1++;
                    while(RandIndex == 0 && a1 > 12) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 1) {
                    a2++;
                    while(RandIndex == 1 && a2 > 8) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 2) {
                    a3++;
                    while(RandIndex == 2 && a3 > 10) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 3) {
                    a4++;
                    while(RandIndex == 3 && a4 > 8) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 4) {
                    a5++;
                    while(RandIndex == 4 && a5 > 8) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 5) {
                    a6++;
                    while(RandIndex == 5 && a6 > 10) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 6) {
                    a7++;
                    while(RandIndex == 6 && a7 > 3) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 7) {
                    a8++;
                    while(RandIndex == 7 && a8 > 5) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 8) {
                    a9++;
                    while(RandIndex == 8 && a9 > 6) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 9) {
                    a10++;
                    while(RandIndex == 9 && a10 > 5) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 10) {
                    a11++;
                    while(RandIndex == 10 && a11 > 9) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 11) {
                    a12++;
                    while(RandIndex == 11 && a12 > 3) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 12) {
                    a13++;
                    while(RandIndex == 12 && a13 > 8) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 13) {
                    a14++;
                    while(RandIndex == 13 && a14 > 4) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 14) {
                    a15++;
                    while(RandIndex == 14 && a15 > 6) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 15) {
                    a16++;
                    while(RandIndex == 15 && a16 > 6) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 16) {
                    a17++;
                    while(RandIndex == 16 && a17 > 8) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 17) {
                    a18++;
                    while(RandIndex == 17 && a18 > 12) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 18) {
                    a19++;
                    while(RandIndex == 18 && a19 > 10) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 19) {
                    a20++;
                    while(RandIndex == 19 && a20 > 7) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 20) {
                    a21++;
                    while(RandIndex == 20 && a21 > 5) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 21) {
                    a22++;
                    while(RandIndex == 21 && a22 > 10) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                else if(RandIndex == 22) {
                    a23++;
                    while(RandIndex == 22 && a23 > 9) {
                        RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
                    }
                }
                    timetable[i][j][k] = seniorClasses[RandIndex];
                    cout << timetable[i][j][k] << " " << flush;
                }
                else if(timetable[i][j][k] == "0") {
                    cout << "ABS " << flush;
                }
            }
            cout << endl;
        }
        cout << endl;
    }
    return 0;
}

因此,现在,代码从高级级别中选择数据并输入它们,但我希望它之后,例如挑选10倍8次,停止代码再次选择10倍。这可能吗?谢谢!

解决此问题的一种方法是添加一个数组,每次添加与之关联的RandIndex项目时,都会将每个元素递增。说您的元素0 =免费,元素3 = 7a;随机选择7a时,您将增加元素3。

这种外观的一种方式是这样:

    RandIndex = rand() % (sizeof(seniorClasses)/sizeof(string));
    if (seniorClass[RandIndex]);        
      counterArray[RandIndex]++;
    if (counterArray[RandIndex] < someValue)
     timetable[i][j][k] = seniorClasses[RandIndex];

这不是最优雅的答案,但是在您的嵌套循环中,只要您的阵列尺寸不大,这样的解决方案就可以正常工作。如果您曾经想将其导出到可能接近100或更大数组尺寸的应用程序中

我没有尝试运行此代码,所以请使用这个想法并发挥创意,因为您可以为您当前的方法做这项工作。

您可能需要使用地图存储您已经使用的索引以及使用它们的次数。这不是一个完整的例子,但它使您可以了解自己可以做什么。

#include <string>
#include <map>
using namespace std;
int main()
{
map<size_t, size_t> indexCountMap; // key : index. value : number of times that index has been used
while(1)
    {
    size_t randomIndex = 0; // Generate a random index here that is within the boundary of "seniorClasses"
    auto it = indexCountMap.find(randomIndex);
    if (it == indexCountMap.end())
        indexCountMap[randomIndex] = 1; // Create the entry in the map
    else
        indexCountMap[randomIndex]++;   // Increment existing entry
    if (10 == indexCountMap[randomIndex])
        break;
    }
}

另外,我不确定为什么您需要使用3D字符串数组。可能有更好的方法可以在1D结构中表达您的数据。