标题:求大佬帮忙检查错误,无论输出多少,结果都为21
只看楼主
编程新人021
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-12-29
结帖率:66.67%
已结贴  问题点数:20 回复次数:5 
求大佬帮忙检查错误,无论输出多少,结果都为21
原题是求n个小球落在各个格子内的个数
#include <iostream>
#include<cstring>
#include<ctime>
#include<iostream>
using namespace std;
int main()
{
int a[10];
int i,j,m,x,n,s=0;
cout<<"输入n的值";
cin>>n;
memset(a,0x0,sizeof a);
srand(time (0));
for(i=0;i<n;i++)
   {
    for(j=0;j<10;j++)
       {x=rand()%2;
        s+=x;}
    a[s]=a[s]+1;
     s=0;
   }
for(m=0;m<10;m++)
   {cout<<a[10]<<"   ";}
    return 0;
}
搜索更多相关主题的帖子: 多少 include 检查 结果 int 
2020-12-29 11:59
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
cout<<a[10]<<"   ";
我猜你想要的是 cout<<a[m]<<"   "; 吧

给个题目吧
for(j=0;j<10;j++)
       {x=rand()%2;
        s+=x;}
否则完全看不懂你这么写的意义
2020-12-29 12:16
编程新人021
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-12-29
得分:0 
回复 2楼 rjsp
在一定的条件下,并不是总是出现相同结果的现象称为随机现象。一个验证频率稳定性的著名试验是由英国生物统计学家高尔顿( Galton)设计的。
自上端放入一小球,任其自由下落,在下落过程中当小球碰到钉子时,从左边落下与从右边落下的机会相等。碰到下一排钉子时又是如此。最后落入底板中的某一格子。因此。任意放入一球,则此球落入哪一个格子,预先难以确定。但是实验证明,如放入大量小球,则其最后所呈现的曲线,几乎总是一样的。也就是说,小球落入各个格子的频率十分稳定。这个试验模型称为高尔顿板。
用随机函数来模拟高尔顿板,首先输入n,表示有n个小球从顶端依次落下,最后统计各个格子中的小球数字。
【问题分析】小球落下,经过每个钉板时有种情况:往左落或往右落。经过10层钉板,最后可能落在10个格子内。
【算法设计】使用随机数来模拟一个小球经过每层钉板的落下情况,记录小球落在哪个格子内,最后统计n个小球落在各个格子内的个数。
2020-12-29 17:36
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:185
帖 子:1404
专家分:8479
注 册:2010-3-16
得分:10 
改了下你的代码,输入的n要大一些,1千起步。
程序代码:
#include <iostream>
#include<ctime>
using namespace std;
int main()
{
    int a[10] = {};
    int i, j, m, x, n, s;
    cout << "输入n的值";
    cin >> n;
    srand(time(0));

    for(i = 0; i < n; i++)
    {
        s = 0;
        for(j = 0; j < 10; j++)
        {
            x = rand() % 2;
            s += x;
        }
        a[s] += 1;
    }

    for(m = 0; m < 10; m++)
    {
        cout << a[m] << "\t";
    }

    return 0;
}
2020-12-29 18:33
编程新人021
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2020-12-29
得分:0 
回复 4楼 apull
确实!!!问题解决了,就是那个m的问题
运行的也快了
感恩大佬!!
2020-12-29 20:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
经过10层钉板,最后可能落在10个格子内。
这是错误的,经过9层钉板,最后可能落在10个格子内。
这一点从你的代码中也能看出来,for(j=0;j<10;j++){x=rand()%2;s+=x;}之后,s的值可能等于10,a[s]就越界了。

程序代码:
#include <iostream>
#include <ctime>
using namespace std;

int main( void )
{
    cout << "输入n的值: ";
    unsigned n;
    cin >> n;

    unsigned a[10] = {};
    srand( (unsigned)time(NULL) );
    for( unsigned i=0; i!=n; ++i )
    {
        unsigned s = 0;
        for( unsigned j=0; j!=9; ++j )
            s += rand()>RAND_MAX/2;
        ++a[s];
    }

    for( unsigned i=0; i!=10; ++i )
        cout << a[i] << "\t\n"[i+1==10];

    cout << "理论上其个数应当是:\n";
    for( unsigned i=0,a=1,b=1; i!=10; ++i,a*=10-i,b*=i )
        cout << 1.*a/b/(1u<<9)*n << "\t\n"[i+1==10];
}

一个可能的运行结果是
输入n的值: 512
2    7    32    84    143    117    80    35    11    1
理论上其个数应当是:
1    9    36    84    126    126    84    36    9    1
2020-12-29 20:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-504431-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017931 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved