读书人

c++ rand函数测试出乎小弟我的意料

发布时间: 2013-04-20 19:43:01 作者: rapoo

c++ rand函数测试,出乎我的意料,我的测试代码有问题吗?
本帖最后由 yxylwt 于 2013-04-04 18:58:45 编辑


const int NCOINS = 10;
const long NTOSSES = 50000L;

srand(unsigned(time(0)));

long i, heads[NCOINS];
int j;

// 初始化数组heads
for(j = 0; j < NCOINS; ++j)
heads[j] = 0;

int rd=0;

// 重复50,000次模拟事件
for(i = 0; i < NTOSSES; ++i)
{
for(j = 0; j < NCOINS; ++j)
{
rd=rand()%10;
if (rd==j)
{
heads[j]++;
break;
}
}
}

// 输出频率图
for(i = 0; i < NCOINS; ++i)
{
cout << i << ":"<< heads[i]<<endl ;
}
return 0;


输出结果为:
0:5043
1:4470
2:4008
3:3697
4:3268
5:2914
6:2694
7:2432
8:2105
9:1949

怎么会这样?不应该各个数试大致相同的吗?为什么9与0出现的几率差这么大?是随机数的种子时间的问题? rand
[解决办法]
// 重复50,000次模拟事件
for(i = 0; i < NTOSSES; ++i)
{
for(j = 0; j < NCOINS; ++j)
{
rd=rand()%10;
if (rd==j)
{
heads[j]++;
break;
}
}
}

你不觉得这里的逻辑很怪吗。。。
[解决办法]
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int arr[10] = {0};
for(int i=0; i<500000; ++i)
++arr[rand()%10];

for(int i=0; i<10; ++i)
printf("%d : %d\n", i, arr[i]);
return 0;
}
如果你的代码是这样
那么结果应该比较合理
[解决办法]
这样不就可以了吗:
[root@down c]# ./main 
0:5054
1:5075
2:4946
3:4923
4:5133
5:4921
6:5091
7:4911
8:4953
9:4993
[root@down c]# cat main.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *const argv[])
{
int i;
int h[10] = {0};
for (i = 0; i < 50000; ++i) {
int rd = rand() % 10;
h[rd]++;
}
for (i = 0; i < 10; ++i) {
printf("%d:%d\n", i, h[i]);
}


return 0;
}


[解决办法]
你把你的输出的结果加起来看看有没有5W呢?

漏了很多亲

读书人网 >C++

热点推荐