准备模拟一下10000次内两个数之差小于20的概率,但是输出结果是1和0,无法达到预期
#include
#include
int main()
{
srand((unsigned)time(NULL));
int i = 0;
int count1 = 0;
int count2 = 0;
double percent1 = 0.0;
double percent2 = 0.0;
for (i = 1; i < 10000; i++)
{
long a = rand();
long b = rand();
if ((a - b) < 20 || (b - a) < 20)
{
count1++;
}
else
{
count2++;
}
}
percent1 = count1 / (count1 + count2);
percent2 = count2 / (count1 + count2);
printf("percent1=%lf,percent2=%lf\n", percent1, percent2);
return 0;
}
两个数之差,这两个数的范围是多少?
这段代码的主要问题出在第 15 行:if ((a - b) < 20 || (b - a) < 20) ,这个判断条件,每次生成的两个数 a b 都符合这个条件,count1++; 造成最后count1 = 9999,count2 = 0。修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned int)time(NULL));
int i = 0;
int count1 = 0;
int count2 = 0;
double percent1 = 0.0;
double percent2 = 0.0;
for (i = 1; i < 10000; i++)
{
long a = rand();
long b = rand();
if (abs(a - b) < 20) //|| (b - a) < 20) 修改
{
count1++;
}
else
{
count2++;
}
}
percent1 = count1 * 1.0 / (count1 + count2);
percent2 = count2 * 1.0 / (count1 + count2);
printf("percent1=%%%.2lf,percent2=%%%.2lf\n", percent1 * 100, percent2 * 100);
return 0;
}
percent1 = count1 * 1.0 / (count1 + count2);
percent2 = count2 * 1.0 / (count1 + count2);
因为count1和count2都是整数,所以count1/(count1+count2)是整除,导致结果是0或1,不会出现小数。