我是第二学期的计算机编程学生。通过价值/参考传递函数仍然是我努力奋斗的事情。以下代码生成一个随机的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;
}
答案 0 :(得分:1)
我间接相信的一些想法会解决你的问题:
并非所有随机数生成器都是相同的,并且无论如何都需要正确初始化它们。
您声明MatchCount
而没有给它一个初始值,然后可能会返回它而不会将其设置为任何东西。这是未定义的行为。
即使匹配,并且您将MatchCount
设置为1
,如果您获得第二场比赛会怎样?您再次将其设置为1
。所以你不是在计算每场比赛。
计数从0 RandomSet[i] = (rand()%366)
开始,如果它等于1
,则向其添加0
表示您的1
天的可能性是1
的两倍发生了,你的分配不再统一。修改为365,如果您必须显示当天,可以在显示它之前添加Orders
----
id
amount
price
,以便将其移至所需的域。
有分类的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次碰撞。