首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++ rand函数测试,出乎小弟我的意料,小弟我的测试代码有有关问题吗

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

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呢?

漏了很多亲

热点排行