带菜单的生日悖论作业(C ++)

时间:2016-02-16 22:08:44

标签: c++

我是第二学期的计算机编程学生。通过价值/参考传递函数仍然是我努力奋斗的事情。以下代码生成一个随机的23个生日集,并成功测试匹配项。问题是调用此函数1000次来测试生日匹配的百分比。

我尝试过几种不同的方法,通过引用将一个int从main()传递给这个函数,所以每当找到匹配时,它都会增加1.我尝试的另一种方法是在内部创建一个int。 function设置为0.如果找到匹配项,则将此int更改为1并返回。任何帮助将不胜感激!

#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>

using namespace std;

int SortedArray();

int main(){

    srand(time(0));

    int count = 0;
    const int Columns = 23;

    for(int h=1; h<1000; h++){
        SortedArray();
        if(SortedArray() == 1){
            count++;
        }
    }
    cout << count;
}


int SortedArray(){

    int MatchCount;
    int RandomSet[24] = {0};
    const int Columns = 24;


    for (int i=1; i < Columns; i++){
        RandomSet[i] = (rand()%366);
            if (RandomSet[i] == 0){
                RandomSet[i] = RandomSet[i] + 1;
            }
    }

    for (int l=0; l < Columns; l++){
        for (int k=1; k < Columns; k++){
            for (int j=1; j < Columns; j++){
                int Temp = 0;
                if (RandomSet[j] > RandomSet[j+1]){
                    Temp = RandomSet[j];
                    RandomSet[j] = RandomSet[j+1];
                    RandomSet[j+1] = Temp;
                }                   
            }
        }

        if(RandomSet[l] == RandomSet[l+1]){
                MatchCount = 1;
        }

    }   

return MatchCount;
}

3 个答案:

答案 0 :(得分:1)

我间接相信的一些想法会解决你的问题:

  1. 并非所有随机数生成器都是相同的,并且无论如何都需要正确初始化它们。

  2. 您声明MatchCount而没有给它一个初始值,然后可能会返回它而不会将其设置为任何东西。这是未定义的行为。

  3. 即使匹配,并且您将MatchCount设置为1,如果您获得第二场比赛会怎样?您再次将其设置为1。所以你不是在计算每场比赛。

  4. 计数从0 RandomSet[i] = (rand()%366)开始,如果它等于1,则向其添加0表示您的1天的可能性是1的两倍发生了,你的分配不再统一。修改为365,如果您必须显示当天,可以在显示它之前添加Orders ---- id amount price ,以便将其移至所需的域。

  5. 有分类的STL功能,您不必自己编写。

答案 1 :(得分:0)

谢谢大家的建议!莱恩,3。)是故意的。在一组生日中,它只寻找1场比赛。因此,如果一组24中有2个或更多匹配,则它仍然只计为1.

是的,这个任务确实踢了我的屁股..这个任务的第三部分是采用这个数组并将其转换为月/日并显示如图所示。

以下是给出的程序参数 HomeWork #3

答案 2 :(得分:0)

我发现你的问题很有趣。正如上面已经指出的那样,无论如何都没有必要对数组进行排序。

更多的天数限制在365天,因此内存不是限制因素。所以我使用std::set数据结构为我计算计数。我是一个非常懒惰的程序员!

观察std::set可以包含每个键一次,所以如果没有碰撞,则集合的大小等于放入其中的数字的大小。

#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <set>

int countCollisions(){

    int MatchCount;
    const int Columns = 25;
    const int Days = 365;
    std::set<int> RandomSet;
    for (int i=0; i<Columns; i++) {
        RandomSet.insert(rand()%Days);
    }
    return Columns-RandomSet.size();
}

int main(){

    srand(time(0));

    int atLeastOne = 0;
    int totalNumber = 0;
    const int Columns = 23;

    for(int h=0; h<1000; h++){
        int value=countCollisions();
        totalNumber+=value;
        atLeastOne+=value>0?1:0;
    }
    std::cout << atLeastOne << " " << totalNumber << std::endl;
}

也许你想稍微使用这段代码。尝试将Columns的数量更改为366.根据鸽子原则,你应该得到1000次碰撞。